मैं एक साधारण समांतर अनुप्रयोग पर काम कर रहा हूं जिसमें मैं कार्यकर्ता प्रक्रियाओं के परिवार के बारे में स्थिति की जानकारी बनाए रखने के लिए एक प्रक्रिया का उपयोग करना चाहता हूं। यह एक POSIX संदेश कतार स्थापित करने के लिए अपेक्षाकृत आसान लगता है जिसमें सभी कार्यकर्ता मधुमक्खी स्थिति रखरखाव के लिए आवधिक अद्यतन भेज सकते हैं। मेरी समस्या? एक POSIX संदेश कतार का नाम होना चाहिए। मैं एक नाम नहीं चुनना चाहता; मुझे बस एक अनूठी संदेश कतार मिल रही है, जितना मैं IPC_PRIVATE
के साथ SYSV संदेश कतार का उपयोग करूँगा। एक अद्वितीय फ़ाइल नाम के लिए मैं mkstemp(3)
का उपयोग कर सकता हूं या एक अद्वितीय खुली फ़ाइल डिस्क्रिप्टर के लिए मैं tmpfile(3)
का उपयोग कर सकता हूं। मुझे एक अद्वितीय POSIX संदेश कतार कैसे प्राप्त करनी चाहिए?एक अद्वितीय POSIX संदेश कतार कैसे प्राप्त करें?
उत्तर
मैं कोई नाम नहीं चुनना चाहता; सब मैं के बारे में एक अनूठा संदेश कतार रही है परवाह, ज्यादा के रूप में मैं एक नाम निर्दिष्ट करने के IPC_PRIVATE साथ SysV संदेश कतार का उपयोग कर
ठीक है, POSIX संदेश कतार के साथ, आप कर होता, लेकिन आप की जरूरत नहीं है इसे संरक्षित करने के लिए और न ही दूसरों को उसी नाम से उसी कतार का उपयोग करने की अनुमति दें।
IPC_PRIVATE अनुकरण
क्या mkstemp
और tmpfile
हुड के नीचे करना मत करो। कुछ "/ reasonably_unique", mq_open
इसे O_CREAT | O_EXCL, और उसके बाद mq_unlink
उत्पन्न करने के लिए "tmp"/"temp" नाम चयन एल्गोरिदम का कोई भी उधार लें। बाल कार्यकर्ता प्रक्रियाएं तब संदेश कतार वर्णनकर्ता का उत्तराधिकारी हो सकती हैं।
चेतावनी: क्या रूट हो सकता है या आपका ईयूआईडी खराब हो सकता है कि आप क्या कर रहे हैं और mq_open
और mq_unlink
के बीच कूद सकते हैं? हाँ।
वैकल्पिक कार्यान्वयन
वैकल्पिक रूप से, socketpair
या pipe
बजाय एक SOCK_DGRAM का उपयोग करें। वे POSIX संदेश कतारों के समान समान अर्थशास्त्र प्रदान करते हैं — attr.mq_msgsize
SO_SNDBUF/SO_RCVBUF या PIPE_BUF का सम्मान करने के लिए एक अनुबंध बन जाता है, mq_notify
I/O चुनिंदाता (शायद पहले से ही मामला) — बन जाता है हालांकि आप संदेश प्राथमिकता खो देते हैं।