crossplatform.ru

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


  Ответ в Блокировка файла (fcntl)
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Litkevich Yuriy Дата 29.11.2009, 17:07
  См. тему: Справка по кнопкам и тэгам форума
oleg_2 Дата 29.11.2009, 16:25
  Блокировка файла (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);
в обработчике, то это выход из положения.

Хотелось бы понять почему не работает как задумано.
Кто знает прошу ответить.
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 29.3.2024, 10:15