C++ Linux Связывание процессов каналом

Linux С++

Помогите!
Следующий пример работает нормально:

int main (int argc, char * argv[])
{
int pipedes[2];
pid_t pid;
pipe(pipedes);
pid = fork();
if ( pid > 0 )
{
char str[] = "String passed via pipe\n";
close(pipedes[0]);
int channel = pipedes[1];
write(channel, (void *) str, strlen(str) + 1);
close(channel);
}
else
{
char buf[1024];
int len;
int channel = pipedes[0];
close(pipedes[1]);
len = read(channel, buf, 1024); /// !!!
write(2, buf, len);
close(channel);
}
return 0;
}

Но вызов функции read() останавливает выполнение процесса до тех пор, пока не примет данные. Как этого можно избежать?

Примечание:
Спасибо, решил проблему так:

fcntl(pipedes[0],F_SETFL,O_NONBLOCK);
fcntl(pipedes[1],F_SETFL,O_NONBLOCK);
Ответы:
Надо использовать асинхронный ввод/вывод. Это вроде можно сделать как-то через fnctl, либо же использовать poll с таймаутом вместо read/write
http://linux.die.net/man/2/poll
В man-странице по pipe говорится, что в Linux также есть системный вызов pipe2, которому можно передать флаг O_NONBLOCK, после чего read не будет ждать.


15 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.