[СИ] Прервать процесс.
Язык СИ ОС 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() там нет.
Чем руководствоваться практически? Или есть ли другие способы
обойти эту двусмысленность?
Кто знает прошу ответить.

