Двухсторонние пайпы - это скорее редкость чем правило в *nix. А сделать надо два раза вызов pipe - одну дудку использовать на прием, другую - на передачу
tftpd: Dec 3 17:33:11 relay in.tftpd[17957]: cannot set groups for user nobody
так а зачем, все ж просто открываешь на чтение и на запись одну трубку, только если открываешь на чтение процесс ждет пока в трубку не поступит что либо те блокируеться
> Двухсторонние пайпы - это скорее редкость чем правило в *nix.
> А сделать надо два раза вызов pipe - одну дудку использовать
> на прием, другую - на передачу
Близко... но не точно ;-)
Канал, возвращаемый pipe() является двунаправленным
в STREAMS-based системах, например SVR4 (Solaris, AIX ...).
Однонаправленный pipe() происходит от BSD систем.
В случае Linux (как не-STREAMS-based системы) pipe() является
однонаправленным. Можно установить отдельный LiS (Linux STREAMS)
пакет и получить STREAMS-based двунаправленные каналы.
Однако, IMO, предпочтительным и более переносимым является
использование socketpair() - в любой системе она возвращает
двунаправленный канал.
Так вот этот самый Стивенс и пишет, что для переносимости кода - делать два раза вызов pipe. Насчет "Читайте Стивенса" - читаем внимательно, чего и Вам желаем.
Да... полный - это немного круто прозвучало, но аналог уж точно.
С точностью до того, о чем я писал выше:
-- pipe(fd);
++ char *s=tmpnam();
++ mknod (...); //FIFO
++ fd[0]=open(..., O_RDWR);
++ fd[1]=open(...,O_RDWR);
++ unlink(s);
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.
Да, это был кусок 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.