[СИ] Прервать процесс.
Язык СИ ОС UNIX
Требуется прервать процесс, подвисший на блокировке файла fcntl.
Имеется кусок кода:
int volatile fl_int = 0;
int volatile fd_int = -1;
void sigint(int n)
{
close(fd_int);
fl_int=1;
return;
}
....
signal(SIGINT, sigint);
sigprocmask(SIG_SETMASK, &mask2, NULL); //--- блокирует SIGINT ---
....
fd_int=fd;
sigprocmask(SIG_SETMASK, &mask1, NULL); //--- разблокирует SIGINT ---
k=my_lock(fd, F_WRLCK); //--- блокировка файла fcntl ---
sigprocmask(SIG_SETMASK, &mask2, NULL); //--- блокирует SIGINT ---
fd_int=-1;
if(fl_int > 0){ fd=-1; return(-1);}
....
При опробовании это работает. Но при опробовании много чего
работает. А будет ли это работать всегда? Я имею в виду вызов
close() в обработчике сигналов. Вынести его из обработчика
(с использованием sigaction и сброшенным флагом SA_RESTART)
плохо тем, что сигнал может придти между разблокированием
сигнала и блокировкой файла. И я безнадежно зависну
на блокировке файла.
В книге Стивенса
«UNIX взимодействие процессов» в таблице 5.1 приведен список
функций, допустимых в обработчике по POSIX. В этот список
функция close() входит. Там же в примечании к этой таблице
указаны функции по ANSI C и UNIX 98. close() там нет.
Чем руководствоваться практически? Или есть ли другие способы
обойти эту двусмысленность?
Кто знает прошу ответить.