crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Блокировка файла (fcntl)
oleg_2
  опции профиля:
сообщение 29.11.2009, 16:25
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 12
Регистрация: 25.7.2009
Пользователь №: 943

Спасибо сказали: 1 раз(а)




Репутация:   0  


Блокировка файла (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);
в обработчике, то это выход из положения.

Хотелось бы понять почему не работает как задумано.
Кто знает прошу ответить.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 29.11.2009, 17:07
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9632
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 769 раз(а)




Репутация:   94  


См. тему: Справка по кнопкам и тэгам форума
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 18.12.2017, 21:24