Привет! пишется программа, которая создает родительский и дочерний процесс, родительский процесс блокирует 20 байт и засыпает на 15 секунд, дочерний процесс посылает сигнал на разблокировку файла..и записывает в файл..
Что делает прога на самом деле:
Родительский процесс пишет, чт офайл заблокирован, но, дочерний тут же пишет, что строка записана(мы вводим ее scanf'ом) а при попытки разблокировки: "Дочерний процесс: ошибка разблокирования"!
Люди, поможите, завтра еще выложу текст проги!
fcntl(); (Необходимо в Мандриве заблокировать 10 байт файла)
Модератор: Модераторы разделов
-
- Сообщения: 34
- ОС: Linux
Re: fcntl();
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,установленной на виртуальной машине.
Очень нужна ваша помощь!Заранее ОГРОМНОЕ СПАСИБО!