Блокировка файла (fcntl)
Язык СИ
ОС UNIX - Free-bsd
Нужно прервать процесс, ожидающий блокировку файла.
Процесс, ожидающий блокировку файла,
получает сигнал и почти не реагирует на этот сигнал.
Не могу понять почему.
Вот тестовая программа:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <signal.h>
const char *f_test=«test»;
int fl_int=0, fd;
//---------------------- sigint -------------------------------------
void sigint(int n)
{
printf(«signal\n»);
//close(fd);
fl_int=1;
return;
}
//-------------------------- main -------------------------
int main()
{
int k;
pid_t pid;
fd=open(f_test,O_RDWR);
if(fd<0){ printf(«fd=open(%s)=%d\n»,f_test,fd); exit(0);}
pid=fork();
if(pid<0){ printf(«pid=fork()<0\n»); exit(0);}
if(pid==0){
signal(SIGINT, sigint);
sleep(5);
k=my_lock(fd,F_WRLCK);
printf(«k2=my_lock=%d\n»,k);
sleep(20);
exit(0);
}
if(pid>0){
k=my_lock(fd,F_WRLCK);
printf(«k1=my_lock=%d\n»,k);
sleep(10);
kill(pid, SIGINT);
sleep(10);
exit(0);
}
exit(0);
}
//------------------------------------- my_lock -----------------------------------
int my_lock(int fd,int cmd)
{
int k; struct flock lock;
lock.l_type=cmd;
lock.l_whence=SEEK_SET;
lock.l_start=0;
lock.l_len=0;
k=fcntl(fd,F_SETLKW,&lock);
return(k);
}
(Функция printf() запрещена в обработчиках сигналов,
но поскольку программа простая тестовая и от безысходности)
(состояние процессов удобно смотреть в другом окне утилитой top)
Эта программа не работает так, как я ожидал.
Ожидалось:
0 сек. -запуск программы, процесс (pid>0) блокирует файл;
5 сек. -процесс (pid==0) запрашивает блокировку файла и ждет её;
15 сек. -процесс (pid==0) получает сигнал, ожидание блокировки
прерывается. Вызов k=fcntl(fd,F_SETLKW,&lock); возвращает -1;
На самом деле работает так:
0 сек. -запуск программы, процесс (pid>0) блокирует файл;
5 сек. -процесс (pid==0) запрашивает блокировку файла и ждет её;
15 сек. -процесс (pid==0) прерывается сигналом
(обработчик пишет слово signal), и снова,
как ни в чем не бывало дожидает блокировку.
Дождавшись получает её.
fd -объявлен глобальным потому, что если раскомментировать строку
//close(fd);
в обработчике, то это выход из положения.
Хотелось бы понять почему не работает как задумано.
Кто знает прошу ответить.
Ответ на:
комментарий
от gena2x
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум [СИ] Прервать процесс. (2011)
- Форум locks (2014)
- Форум Чтение выхлопа процесса без ожидания его завершения (2019)
- Форум SIGIO и чужой терминал (2008)
- Форум ptrace() и сигналы (2018)
- Форум ПОМОГИТЕ С ПРОГРАММОЙ. (2010)
- Форум fork(), exec(), wait() (2020)
- Форум проблема с чтением из FIFO (2024)
- Форум Pipe (2011)
- Форум Ошибка: undefined reference to 'shm_unlink' (2010)