Tôi đang tìm kiếm một mutex có tên để tôi có thể đảm bảo loại trừ lẫn nhau trong suốt quá trình (đảm bảo chỉ có một quy trình chạy trên một số thuộc tính). Tôi đã không tìm thấy một (có vẻ như tôi có thể đã không nhìn cứng đủ) và vì vậy tôi thực hiện giả của tôi tên là mutex trong linux bằng cách sử dụng một ổ cắm miền UNIX trừu tượng. Chỉ một bind() duy nhất cho socket đó sẽ thành công. Điều tốt đẹp khác là hệ điều hành sẽ dọn sạch ổ cắm miền UNIX trừu tượng nếu quá trình chết và do đó không dọn sạch ổ cắm.Thật không may tôi không chắc chắn về bất kỳ cách nào để bạn "chờ đợi" trên giả này mutex để trở thành có sẵn.
Ổ cắm miền UNIX trừu tượng là một ổ cắm miền UNIX có tên bắt đầu bằng một byte rỗng. Hãy cẩn thận, tôi tin rằng toàn bộ bộ đệm được sử dụng như tên và do đó bạn muốn đảm bảo rằng bạn không chỉ ghi nhớ hoặc xâu chuỗi một phần vào nó, hoặc nếu bạn chắc chắn rằng bạn đầu tiên điền vào toàn bộ bộ đệm với một số ký tự .
Tất cả trừ liên kết đầu tiên() sẽ thất bại với lỗi không đúng 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;
}
Cảm ơn, Nick
Phụ thuộc vào những gì bạn có nghĩa là bởi "đa". Nếu bạn đi theo định nghĩa stackoverflow, sau đó đa xử lý sẽ bao gồm đa luồng. Nếu bạn có nghĩa là "nhiều quá trình", thì bạn đã đúng. –
Xem http://stackoverflow.com/a/28479697/2189128 – Jeff