LINUX.ORG.RU

Двухсторонние пайпы - это скорее редкость чем правило в *nix. А сделать надо два раза вызов pipe - одну дудку использовать на прием, другую - на передачу

PETER ★★
()

tftpd: Dec 3 17:33:11 relay in.tftpd[17957]: cannot set groups for user nobody

так а зачем, все ж просто открываешь на чтение и на запись одну трубку, только если открываешь на чтение процесс ждет пока в трубку не поступит что либо те блокируеться

alphex_kaanoken ★★★
()
Ответ на: комментарий от PETER

> Двухсторонние пайпы - это скорее редкость чем правило в *nix.
> А сделать надо два раза вызов pipe - одну дудку использовать
> на прием, другую - на передачу

Близко... но не точно ;-)

Канал, возвращаемый pipe() является двунаправленным
в STREAMS-based системах, например SVR4 (Solaris, AIX ...).
Однонаправленный pipe() происходит от BSD систем.

В случае Linux (как не-STREAMS-based системы) pipe() является
однонаправленным. Можно установить отдельный LiS (Linux STREAMS)
пакет и получить STREAMS-based двунаправленные каналы.

Однако, IMO, предпочтительным и более переносимым является
использование socketpair() - в любой системе она возвращает
двунаправленный канал.

Читайте Стивенса - он рулит!

HTH


anonymous
()
Ответ на: комментарий от anonymous

Так вот этот самый Стивенс и пишет, что для переносимости кода - делать два раза вызов pipe. Насчет "Читайте Стивенса" - читаем внимательно, чего и Вам желаем.

PETER ★★
()
Ответ на: Re: от Murr

Значит плохо читал. open2 позволяет _одновременно_ скармливать ввод и получать вывод от процесса, popen - делать что-то одно.

anonymous
()
Ответ на: комментарий от anonymous

Да... полный - это немного круто прозвучало, но аналог уж точно.
С точностью до того, о чем я писал выше:
-- pipe(fd);
++ char *s=tmpnam();
++ mknod (...); //FIFO
++ fd[0]=open(..., O_RDWR);
++ fd[1]=open(...,O_RDWR);
++ unlink(s);

Murr ★★
()
Ответ на: комментарий от anonymous

> Значит плохо читал

???

man popen:

DESCRIPTION The popen() function ``opens'' a process by creating a bidirectional pipe forking, and invoking the shell. Any streams opened by previous popen() calls in the parent process are closed in the new child process. Histor- ically, popen() was implemented with a unidirectional pipe; hence many implementations of popen() only allow the type argument to specify read- ing or writing, not both. Since popen() is now implemented using a bidi- rectional pipe, the type argument may request a bidirectional data flow. The type argument is a pointer to a null-terminated string which must be `r' for reading, `w' for writing, or `r+' for reading and writing.

loki
()
Ответ на: комментарий от Murr

Да, это был кусок manpage из FreeBSD. (там и socketpair реализован через 2-направленный канал) А в Linux я посмотрел - действительно:

DESCRIPTION The popen() function opens a process by creating a pipe, forking, and invoking the shell. Since a pipe is by definition unidirectional, the type argument may specify only reading or writing, not both; the resulting stream is correspondingly read-only or write-only.

loki
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.