Очень нужна помощь! (блокировка с помощью fcntl())

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

Ответить
torart
Сообщения: 1
ОС: vista

Очень нужна помощь!

Сообщение torart »

Доброе время суток!
Имеется задача:Разработать программу которая открывает уже существующий файл и блокирует его первые 20 байт,используя вызов fcntl().Затем она порождает дочерний процесс,пытающийся осуществить запись в файл начиная с 10-го байта.Родительский процесс делает в это время паузу на 5 секунд,после чего снмимает блокировку,разрешая запись. Что я делаю неправильно?

#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,установленной на виртуальной машине.

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