Jump to content

Using pipe in C over Linux

- - - - -

  • Please log in to reply
No replies to this topic

#1
mnirahd

mnirahd

    Programming Professional

  • Members
  • PipPipPipPipPip
  • 330 posts
Pipe is an effective way of communication between process. Pipe has descriptors. One descriptor is used for reading while other end is used for writing.

Usage of pipe is to have communication between child and parent process. We also use pipe to redirect of output of a process to another process. We often use pipe in our shell scripts.

In this tutorial we ll see how we can use pipe for read and write.

pipe() function to create pipe
pipe() creates a pair of file descriptors, pointing to a pipe inode, and places them in the array pointed to by filedes. filedes[0] is for reading, filedes[1] is for writing.

The following is an code example of how to use pipe



#include <sys/wait.h>

#include <assert.h>

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

int

main(int argc, char *argv[])

{

    int pfd[2];

    pid_t cpid;

    char buf;

    assert(argc == 2);

    if (pipe(pfd) == -1) { perror("pipe"); exit(EXIT_FAILURE); }

    cpid = fork();

    if (cpid == -1) { perror("fork"); exit(EXIT_FAILURE); }

    if (cpid == 0) {    /* Child reads from pipe */

        close(pfd[1]);          /* Close unused write end */

        while (read(pfd[0], &buf, 1) > 0)

            write(STDOUT_FILENO, &buf, 1);

        write(STDOUT_FILENO, "\n", 1);

        close(pfd[0]);

        _exit(EXIT_SUCCESS);

    } else {            /* Parent writes argv[1] to pipe */

        close(pfd[0]);          /* Close unused read end */

        write(pfd[1], argv[1], strlen(argv[1]));

        close(pfd[1]);          /* Reader will see EOF */

        wait(NULL);             /* Wait for child */

        exit(EXIT_SUCCESS);

    }

}


References

1. pipe(2): create pipe - Linux man page




1 user(s) are reading this topic

0 members, 1 guests, 0 anonymous users