COHERENT manpages
This page displays the COHERENT manpage for pipe() [Open a pipe].
List of available manpages
Index
pipe() -- System Call (libc)
Open a pipe
#include <unistd.h>
int pipe(fd)
int fd[2];
A pipe is an interprocess communication mechanism. pipe() creates a pipe,
typically to construct pipelines in the shell sh.
pipe() fills in fd[0] and fd[1] with read and write file descriptors,
respectively. The file descriptors allow the transfer of data from one or
more writers to one or more readers. Pipes are buffered to 5,120 bytes.
If more than 5,120 bytes are written into the pipe, the write() call will
not return until the reader has removed sufficient data for the write() to
complete. If a read() occurs on an empty pipe, its completion awaits the
writing of data.
When all writing processe close their write file descriptors, the reader
receives an end of file indication. A write on a pipe with no remaining
readers generates a SIGPIPE signal to the caller.
pipe() is generally called just before fork(). Once the parent and child
processes are created, the unused file descriptors should be closed in each
process.
Example
The following example prints the word Waiting until a line of data is
entered. It illustrates how to use pipe(), fstat(), and fork().
#include <stdio.h>
#include <sys/stat.h> /* for stat */
#include <sgtty.h> /* for stty/gtty functions */
#include <unistd.h>
static int fd[2]; /* pipe array */
main()
{
printf("This prints 'Waiting' every second until a 'q' is hit.\n");
/*
* Pipe may also be constructed by /etc/mknod
* If it is desired to have tasks communicate where
* they are not parent and child. In this case make
* sure the constructed pipe has the correct owner and
* permissions. Such pipe may be used exactly like this
* but open()ed on each side.
*/
if (-1 == pipe(fd)) {
fprintf(stderr, "Cannot open pipe\n");
exit(EXIT_FAILURE);
}
if (fork())
parentProcess();
else
childProcess();
exit(EXIT_SUCCESS);
}
parentProcess()
{
struct stat s;
char buff;
for (buff = ' '; 'q' != buff;) {
fstat(fd[0], &s); /* get status of pipe */
if (s.st_size) { /* char in the pipe */
read(fd[0], &buff, sizeof(buff));
printf("Got a '%c'\n", buff);
continue;
}
/*
* This can be any process, it can use system()
* or exec()
*/
printf("Waiting\n");
sleep(1);
}
}
childProcess()
{
struct sgttyb os, ns;
char buff;
gtty(fileno(stdin), &os); /* save old state */
ns = os; /* get base of new state */
ns.sg_flags |= RAW; /* process each character as entered */
ns.sg_flags &= ~(ECHO|CRMOD);/* no echo for now... */
stty(fileno(stdin), &ns); /* set mode */
do {
buff = getchar(); /* wait for the keyboard */
write(fd[1], &buff, sizeof(buff));
} while ('q' != buff);
stty(fileno(stdin), &os); /* reset mode */
}
See Also
close(),
libc,
libsocket,
mkfifo(),
mknod(),
read(),
sh,
signal(),
unistd.h,
write()
POSIX Standard, §6.1.1
Diagnostics
pipe() returns zero on successful calls, or -1 if it could not create the
pipe.
If it is necessary to create a pipe between tasks that are not parent and
child, use /etc/mknod to create a named pipe. These named pipes can be
opened and used by different programs for communication. Remember to give
them the correct owner and permissions.
If you attempt to open a pipe write only, O_NDELAY is set, and there are
currently no readers on this pipe, open() returns immediately and sets
errno to ENXIO.




