मैं एक नामित म्युटेक्स लिए देख रहा था, ताकि मैं एक प्रक्रिया (गुण के कुछ सेट प्रति यकीन है कि केवल एक ही प्रक्रिया चल बनाने) की जीवन भर के लिए पारस्परिक अपवर्जन सुनिश्चित कर सकता है। मुझे एक नहीं मिला (ऐसा लगता है कि मैंने काफी कठिन नहीं देखा होगा) और इसलिए मैंने एक अमूर्त यूनिक्स डोमेन सॉकेट का उपयोग करके लिनक्स में अपने स्वयं के छद्म नाम म्यूटेक्स को लागू किया। उस सॉकेट में केवल एक ही बाइंड() सफल होगा। दूसरी अच्छी बात यह है कि यदि प्रक्रिया मर जाती है तो ओएस अमूर्त यूनिक्स डोमेन सॉकेट को साफ़ कर देगा और इस प्रकार सॉकेट को स्वयं साफ़ नहीं करेगा।दुर्भाग्यवश मुझे इस छद्म म्यूटेक्स पर उपलब्ध होने के लिए "प्रतीक्षा" करने का कोई भी तरीका नहीं है।
एक सार यूनिक्स डोमेन सॉकेट एक यूनिक्स डोमेन सॉकेट है जिसका नाम एक शून्य बाइट से शुरू होता है। हालांकि सावधान रहें, मेरा मानना है कि पूरे बफर को नाम के रूप में उपयोग किया जाता है और इस प्रकार आप यह सुनिश्चित करना चाहते हैं कि आप इसमें केवल आंशिक स्ट्रिंग को याद न करें या स्ट्रैपी न करें, या यदि आप सुनिश्चित करते हैं कि आप पहले पूरे बफर को कुछ चरित्र के साथ भरें ।
सभी लेकिन पहले बाइंड() EADDRINUSE की इरनो के साथ असफल हो जाएंगे।
// Create an abstract socket to use as a mutex.
int err;
int mutex_sock = socket(AF_UNIX, SOCK_STREAM, 0);
if (mutex_sock == -1)
{
err = errno;
printf("main, failed creating mutex socket: %s\n",
get_error_string(errno, error_string, sizeof(error_string)));
log_event(LOG_LEVEL_ERROR, "main, failed creating mutex socket: "
"%s", get_error_string(errno, error_string,
sizeof(error_string)));
errno = err;
goto done;
}
// Bind to abstract socket. We use this as a sort of named mutex.
struct sockaddr_un addr;
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path + 1, socket_name, sizeof(addr.sun_path) - 2);
result = bind(mutex_sock, (struct sockaddr*) &addr, sizeof(addr));
if (result == -1)
{
err = errno;
if (errno == EADDRINUSE)
{
printf("main, failed bind to mutex socket: %s. "
"Another instance must be running.\n",
get_error_string(errno,
error_string, sizeof(error_string)));
log_event(LOG_LEVEL_ERROR, "main, failed bind to mutex socket: "
"%s. "
"Another instance must be running.",
get_error_string(errno,
error_string, sizeof(error_string)));
}
else
{
printf("main, failed bind to mutex socket: %s\n",
get_error_string(errno, error_string,
sizeof(error_string)));
log_event(LOG_LEVEL_ERROR, "main, failed bind to mutex socket: %s",
get_error_string(errno, error_string,
sizeof(error_string)));
}
errno = err;
goto done;
}
धन्यवाद, निक
आप "बहु" से क्या मतलब है पर निर्भर करता है। यदि आप स्टैक ओवरफ्लो परिभाषा से जाते हैं, तो मल्टीप्रोसेसिंग में मल्टीथ्रेडिंग शामिल होगी। यदि आपका मतलब है "एकाधिक प्रक्रियाएं", तो आप सही हैं। –
देखें http://stackoverflow.com/a/28479697/2189128 – Jeff