<html lang="en">
<head>
<title>Creating a Pipe - The GNU C Library</title>
<meta http-equiv="Content-Type" content="text/html">
<meta name="description" content="The GNU C Library">
<meta name="generator" content="makeinfo 4.13">
<link title="Top" rel="start" href="index.html#Top">
<link rel="up" href="Pipes-and-FIFOs.html#Pipes-and-FIFOs" title="Pipes and FIFOs">
<link rel="next" href="Pipe-to-a-Subprocess.html#Pipe-to-a-Subprocess" title="Pipe to a Subprocess">
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
<!--
This file documents the GNU C library.

This is Edition 0.12, last updated 2007-10-27,
of `The GNU C Library Reference Manual', for version
2.8 (Sourcery G++ Lite 2011.03-41).

Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002,
2003, 2007, 2008, 2010 Free Software Foundation, Inc.

Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being ``Free Software Needs Free Documentation''
and ``GNU Lesser General Public License'', the Front-Cover texts being
``A GNU Manual'', and with the Back-Cover Texts as in (a) below.  A
copy of the license is included in the section entitled "GNU Free
Documentation License".

(a) The FSF's Back-Cover Text is: ``You have the freedom to
copy and modify this GNU manual.  Buying copies from the FSF
supports it in developing GNU and promoting software freedom.''-->
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css"><!--
  pre.display { font-family:inherit }
  pre.format  { font-family:inherit }
  pre.smalldisplay { font-family:inherit; font-size:smaller }
  pre.smallformat  { font-family:inherit; font-size:smaller }
  pre.smallexample { font-size:smaller }
  pre.smalllisp    { font-size:smaller }
  span.sc    { font-variant:small-caps }
  span.roman { font-family:serif; font-weight:normal; } 
  span.sansserif { font-family:sans-serif; font-weight:normal; } 
--></style>
<link rel="stylesheet" type="text/css" href="../cs.css">
</head>
<body>
<div class="node">
<a name="Creating-a-Pipe"></a>
<p>
Next:&nbsp;<a rel="next" accesskey="n" href="Pipe-to-a-Subprocess.html#Pipe-to-a-Subprocess">Pipe to a Subprocess</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="Pipes-and-FIFOs.html#Pipes-and-FIFOs">Pipes and FIFOs</a>
<hr>
</div>

<h3 class="section">15.1 Creating a Pipe</h3>

<p><a name="index-creating-a-pipe-1616"></a><a name="index-opening-a-pipe-1617"></a><a name="index-interprocess-communication_002c-with-pipes-1618"></a>
The primitive for creating a pipe is the <code>pipe</code> function.  This
creates both the reading and writing ends of the pipe.  It is not very
useful for a single process to use a pipe to talk to itself.  In typical
use, a process creates a pipe just before it forks one or more child
processes (see <a href="Creating-a-Process.html#Creating-a-Process">Creating a Process</a>).  The pipe is then used for
communication either between the parent or child processes, or between
two sibling processes.

   <p>The <code>pipe</code> function is declared in the header file
<samp><span class="file">unistd.h</span></samp>. 
<a name="index-unistd_002eh-1619"></a>
<!-- unistd.h -->
<!-- POSIX.1 -->

<div class="defun">
&mdash; Function: int <b>pipe</b> (<var>int filedes</var><tt>[2]</tt>)<var><a name="index-pipe-1620"></a></var><br>
<blockquote><p>The <code>pipe</code> function creates a pipe and puts the file descriptors
for the reading and writing ends of the pipe (respectively) into
<var>filedes</var><code>[0]</code> and <var>filedes</var><code>[1]</code>.

        <p>An easy way to remember that the input end comes first is that file
descriptor <code>0</code> is standard input, and file descriptor <code>1</code> is
standard output.

        <p>If successful, <code>pipe</code> returns a value of <code>0</code>.  On failure,
<code>-1</code> is returned.  The following <code>errno</code> error conditions are
defined for this function:

          <dl>
<dt><code>EMFILE</code><dd>The process has too many files open.

          <br><dt><code>ENFILE</code><dd>There are too many open files in the entire system.  See <a href="Error-Codes.html#Error-Codes">Error Codes</a>,
for more information about <code>ENFILE</code>.  This error never occurs in
the GNU system. 
</dl>
        </p></blockquote></div>

   <p>Here is an example of a simple program that creates a pipe.  This program
uses the <code>fork</code> function (see <a href="Creating-a-Process.html#Creating-a-Process">Creating a Process</a>) to create
a child process.  The parent process writes data to the pipe, which is
read by the child process.

<pre class="smallexample">     #include &lt;sys/types.h&gt;
     #include &lt;unistd.h&gt;
     #include &lt;stdio.h&gt;
     #include &lt;stdlib.h&gt;
     
     /* <span class="roman">Read characters from the pipe and echo them to </span><code>stdout</code><span class="roman">.</span> */
     
     void
     read_from_pipe (int file)
     {
       FILE *stream;
       int c;
       stream = fdopen (file, "r");
       while ((c = fgetc (stream)) != EOF)
         putchar (c);
       fclose (stream);
     }
     
     /* <span class="roman">Write some random text to the pipe.</span> */
     
     void
     write_to_pipe (int file)
     {
       FILE *stream;
       stream = fdopen (file, "w");
       fprintf (stream, "hello, world!\n");
       fprintf (stream, "goodbye, world!\n");
       fclose (stream);
     }
     
     int
     main (void)
     {
       pid_t pid;
       int mypipe[2];
     
       /* <span class="roman">Create the pipe.</span> */
       if (pipe (mypipe))
         {
           fprintf (stderr, "Pipe failed.\n");
           return EXIT_FAILURE;
         }
     
       /* <span class="roman">Create the child process.</span> */
       pid = fork ();
       if (pid == (pid_t) 0)
         {
           /* <span class="roman">This is the child process.
              Close other end first.</span> */
           close (mypipe[1]);
           read_from_pipe (mypipe[0]);
           return EXIT_SUCCESS;
         }
       else if (pid &lt; (pid_t) 0)
         {
           /* <span class="roman">The fork failed.</span> */
           fprintf (stderr, "Fork failed.\n");
           return EXIT_FAILURE;
         }
       else
         {
           /* <span class="roman">This is the parent process.
              Close other end first.</span> */
           close (mypipe[0]);
           write_to_pipe (mypipe[1]);
           return EXIT_SUCCESS;
         }
     }
</pre>
   </body></html>

