Консультация № 161784
02.03.2009, 05:36
0.00 руб.
0 1 0
Друзья,подскажите пожалуйста,как грамотно решить/переделать задачу с таким условием : "С помощью команды WRITE(): Попытка записать в канал связи меньше байт,чем осталось до его заполнения (без условия блокировок)".Исходя из прилагающегося примера решённой задачи,но с несколько иным условием :

Приложение:
/*С помощью команды WRITE(): Попытка записать в канал связи больше байт, чем осталось до его заполнения. Блокировка вызова разрешена.*/

#include <fcntl.h>
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
int main()
{

size_t n,m;
int flags, buf=8192;
char str[15]="abc";
int fd[2];

f(pipe(fd)<0)
{
printf("Pipe not created!\n");
};
printf("Pipe created!\n");
if ((flags=fcnt(fd[0], F_GETFL,0))<0
printf("Get flags not succes!\n");
flags &=~O_Nonblock;
if(fcnt(fd[0],F_SETFL, flags)<0)
printf("Set flags succes!\n);
int i;
for (i=0; i<(buf+2); i++)
n = write(fd[1], str, 1);
if (errno == EWOULDBLOCK)
{
printf("Write not succes: no more space in pipe\n");
exit(-1);
}
close(fd[1]);
printf("/nClosed file succes\n");
}

Результат:
[root@localhost root]$ gcc z3.c
[root@localhost root]$ ./a.out
Create Pipe succes!
Write not succes: no more space in pipe

Обсуждение

давно
Академик
20764
1861
02.03.2009, 08:30
общий
errno на успешных операциях не сбрасывается, поэтому результат write() надо проверять, и обращаться к errno только если он отрицательный.
Не обязательно (и даже вредно - write() достаточно прожорливый) записывать по одному байту - write не обязан записывать столько, сколько заказано.
Доступность канала на запись можно проверять с помощью select(),pselect() или poll(). Заодно можно и ждать его готовности определённое время.
Форма ответа