Chapter Contents

Previous

Next
pipe

pipe



Create Unnamed Pipe

Portability: POSIX.1 conforming, UNIX compatible


SYNOPSIS
DESCRIPTION
RETURN VALUE
EXAMPLE
RELATED FUNCTIONS
SEE ALSO


SYNOPSIS

#include <unistd.h>

int pipe(int fd[2]);


DESCRIPTION

pipe creates an I/O channel through which a process communicates with another process or with itself. fd points to a memory area where two file descriptors are stored. pipe stores the file descriptor for the output end of the pipe in fd[0] , and it stores the file descriptor for the input end of the pipe in fd[2] . The first data written to the pipe are the first to be read. O_NONBLOCK and FD_CLOEXEC are turned off at both ends of the pipe.


RETURN VALUE

pipe returns 0 if it is successful, and -1 if it is not successful.


EXAMPLE

This example invokes the ls shell command using fork and exec , and uses a pipe allocated to file descriptor 1 to obtain the output of ls and write it to stderr (which may be a non-HFS terminal or disk file if the example is run under OS/390 batch or TSO):

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <lclib.h>

static void do_ls(char * const []);

main()
{
   int pipefds[2];
   pid_t pid;
   char *const parmList[] = {"/bin/ls", "-l", "/u/userid/dirname",
                             NULL };
   char lsout[200];     /* buffer for out ls output              */
   int amt;
   int status;          /* status code from ls                   */

   fclose(stdout);      /* Avoid stdio interfering with fd 1.    */
   pipe(pipefds);       /* Create both ends of a pipe.           */

      /* Make write end of pipe fd 1.                            */
   dup2(pipefds[1],STDOUT_FILENO);

      /* Close write end.                                        */
   if (pipefds[1] != 1) close(pipefds[1]);

      /* In child process, invoke ls.                            */
   if ((pid = fork()) == 0) do_ls(parmList);
   close(1);            /* Close write end of pipe in parent.    */
   for(;;) {            /* Read from the pipe.                   */
      amt = read(pipefds[0], lsout, sizeof(lsout));
      if (amt <= 0) break;
      fwrite(lsout, 1, amt, stderr); /*Write ls output to stderr.*/
   }
   wait(&status);       /* Wait for ls to complete. */
   close(pipefds[0]);   /* Close pipe input end. */
   if (WIFEXITED(status)) exit(WEXITSTATUS(status));
   else          /* If ls failed, use kill to fail the same way. */
      kill(0, WTERMSIG(status));
}

static void do_ls(char *const parmList[]) {
   int rc;
   rc = execvp("ls", parmList);       /* Pass control to ls.     */
      /* execvp must have failed!                                */
   perror("execvp failure");
   abort();             /* Terminate process the hard way.       */
}


RELATED FUNCTIONS

mkfifo


SEE ALSO


Chapter Contents

Previous

Next

Top of Page

Copyright © 2001 by SAS Institute Inc., Cary, NC, USA. All rights reserved.