Мне понадобилось как-то на неделе написать кроссплатформенный семофор (именованный, то есть для межпроцессной синхронизации) со всеми вытекающими. После некоторого анализа того, что и где имеется, решил остановиться на интерфейсе System V (более распространенный, а вояки наши любят использовать что-нибудь подревнее) для unix-систем, для Windows-систем, конечно же, использовать родной API. В итоге все получилось и работает, но у меня возникло несколько вопросов и наблюдений.
То, что API System V неуклюж и несколько перегружен - не вызывает сомнений, хотя, через денек, начинаешь привыкать. Но проблемы вытекают напрямую из этой самой System V. Во-первых, надо создавать для каждого IPC-объекта (семафор, разделяемая память, с другим еще не возился) свой файл и по нему генерить заветный key_t. Почему нельзя было использовать обычную буквенную последовательность, как это, например, сделано в Windows? Да, я знаю про POSIX-интерфейс к IPC, но и там жизнь не легче. Стандартом де-факто в мире UNIX является System V, поэтому от этого и решено было отталкиваться. Поэтому приходиться следить за созданным файлом. Это раз.
У семафора есть такая проблема, что им владеет, фактически, система, а не процессы. То есть, если вдруг процессы сегфолтнутся и семафор будет в этот момент в залоченном состоянии, то при следующем запуске приложения и обращения к семафору я опять получу уже залоченный семафор. Например в Windows семафором «владеют» процессы, и как только все процессы завершатся или «отпустят» семафор, он удаляется. Все просто и надежно. Есть ли какой-то Ъ-вэй решить этот косяк в UNIX-системах? Только, пожалуйста, без костылей типа мастер-процесса следящего за другими, или запускать один процесс всегда первым и т.д. Есть ли что-нибудь готовое на системном уровне? Только не надо говорить про SEM_UNDO - связанные с этим косяки всем известны, равно как и системно-зависимая реализация.
Аналогичная ситуация и с разделяемой памятью - она отлично переживает сегфолты. Думаю, если есть какое-то решение для семафоров, оно будет и для разделяемой памяти. Напрягает еще и то, что приходится следить за тем, кто создавал семафор, чтобы удалить его потом, иначе, если удаляет другой процесс, то другой при первой же операции получает EIDRM. Как костыль для этой ситуации - пересоздавать семафор заново.
Ну и не для флейма ради хочется отметить, что для Windows-платформы вышло кода меньше (с обработкой максимального числа некорректных ситуаций, конечно же), во многом из-за того, что не приходится навешивать все указанные выше костыли.