fcntl(); (Необходимо в Мандриве заблокировать 10 байт файла)

Модератор: Модераторы разделов

Protocol
Сообщения: 34
ОС: Linux

fcntl();

Сообщение Protocol »

Привет! пишется программа, которая создает родительский и дочерний процесс, родительский процесс блокирует 20 байт и засыпает на 15 секунд, дочерний процесс посылает сигнал на разблокировку файла..и записывает в файл..
Что делает прога на самом деле:
Родительский процесс пишет, чт офайл заблокирован, но, дочерний тут же пишет, что строка записана(мы вводим ее scanf'ом) а при попытки разблокировки: "Дочерний процесс: ошибка разблокирования"!
Люди, поможите, завтра еще выложу текст проги!
Спасибо сказали:
Protocol
Сообщения: 34
ОС: Linux

Re: fcntl();

Сообщение Protocol »

Protocol писал(а):
15.12.2007 02:11
Привет! пишется программа, которая создает родительский и дочерний процесс, родительский процесс блокирует 20 байт и засыпает на 15 секунд, дочерний процесс посылает сигнал на разблокировку файла..и записывает в файл..
Что делает прога на самом деле:
Родительский процесс пишет, чт офайл заблокирован, но, дочерний тут же пишет, что строка записана(мы вводим ее scanf'ом) а при попытки разблокировки: "Дочерний процесс: ошибка разблокирования"!
Люди, поможите, завтра еще выложу текст проги!


#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include,stdio.h>
main()
{
int fd;
char buf[40];
struct flock my_lock;
my_lock.l_type=F_WRLCK;
my_lock.l_whence=SEEK_SET;
my_lock.l_start=0;
my_lock.l_len=20;
fd=open("morda",O_WRONLY);
if(fcntl(fd,F_SETLKW,&my_lock)==-1)
{
perror("родительский процесс:ошибка блокирования");
exit(1);
}
else printf("родительский процесс:блокировка установлена")ж
}
switch(fork())
{
case -1:
{
perror("ошибка вызова fork");
exit(1);
}
case 0:
{
printf("введите строку")
scanf("%s",&buf);
lseek(fd,10,SEEK_SET);
if(write(fd,buf,strlen(buf))==-1)
{
printf("дочерний процесс:ошибка записи")
}
else printf("дочерний процесс:запись произвёл");
break;
}
exit(1);
default:
{
sleep(5);
my_lock.l_type=F_UNLOCK;
if(fcntl(fd,F_SETLK,&my_lock)==-1);
{
printf("ошибка сняия блокировки");

}
else printf ("блокировка снята");
exit(1);
}
}

программа выдаёт:


родительский процесс:блокировка установлена
введите строку
(начинает ждать 5 секунд и независимо от того введена строка или нет выдаёт: )
дочерний прцесс:запись произвёл
(проходит остаток времени и: )
родительский процесс:блокировка снята

Если вводишь строку,программа записывает её в файл.

Почему программа не выдаёт ошибку записи?
Прочитал что fcntl() рекомендательная блокировка-что это значит?
И как сделать так,чтобы родительский процесс начинал ждать 5 секунд после ввода строки?

Программирую в linux mandriva,установленной на виртуальной машине.

Очень нужна ваша помощь!Заранее ОГРОМНОЕ СПАСИБО!
Спасибо сказали:
Protocol
Сообщения: 34
ОС: Linux

Re: fcntl();

Сообщение Protocol »

Люди! ну кто нибудь поможет??
Спасибо сказали: