У меня есть несколько приложений, скомпилированных с g ++, работающих в Ubuntu. Я использую названные семафоры для координации между различными процессами.Как восстановить семафор, когда процесс, который уменьшил его до нуля, сбой?
Все работает отлично, за исключением в следующей ситуации: Если один из процессов вызывает sem_wait()
или sem_timedwait()
для уменьшения семафора, а затем падает или убит -9, прежде чем он получает возможность позвонить sem_post()
, то с этого момента , названный семафор «неприменим».
Под «непригодным», я имею в виду, счет семафора теперь равен нулю, а процесс, который должен был увеличить его до 1, умер или был убит.
Я не могу найти API sem_*()
, который мог бы сказать мне, что процесс, последний раз уменьшенный, он разбился.
У меня отсутствует API где-нибудь?
Вот как я открываю с именем семафор:
sem_t *sem = sem_open("/testing",
O_CREAT | // create the semaphore if it does not already exist
O_CLOEXEC , // close on execute
S_IRWXU | // permissions: user
S_IRWXG | // permissions: group
S_IRWXO , // permissions: other
1 ); // initial value of the semaphore
Вот как я декрементирую:
struct timespec timeout = { 0, 0 };
clock_gettime(CLOCK_REALTIME, &timeout);
timeout.tv_sec += 5;
if (sem_timedwait(sem, &timeout))
{
throw "timeout while waiting for semaphore";
}
+1, в конечном итоге делали то же самое, семафоры бесполезны в таких сценариях –
Кто-то отправил мне электронное письмо, чтобы узнать больше. Я написал небольшую запись в блоге почти 3 года назад, когда столкнулся с этой проблемой. Более подробную информацию о том, как я решил это с блокировкой файлов, можно найти здесь: http://charette.no-ip.com:81/programming/2010-01-13_PosixSemaphores/index.html –
Можно ли сделать то же самое, просто открыв закрытие файла? Я нашел это на странице man для open(): «Когда вы открываете файл, семантика блокировки с помощью flock (2) может быть получена путем установки O_SHLOCK для общей блокировки или O_EXLOCK для исключительной блокировки». –