Docsity
Docsity

Prepare for your exams
Prepare for your exams

Study with the several resources on Docsity


Earn points to download
Earn points to download

Earn points by helping other students or get them with a premium plan


Guidelines and tips
Guidelines and tips

Linux Pipe Function: pipe() and pipe2(), Study notes of Computer Numerical Control

The linux pipe function, which creates a unidirectional data channel for interprocess communication. It includes a synopsis of the pipe() and pipe2() functions, their descriptions, return values, errors, versions, and conforming specifications. Two examples are provided to illustrate the usage of pipes in linux.

Typology: Study notes

2010/2011

Uploaded on 09/06/2011

nirmalya
nirmalya 🇮🇳

4.5

(2)

17 documents

1 / 4

Toggle sidebar

This page cannot be seen from the preview

Don't miss anything!

bg1
PIPE(2) Linux Programmer's Manual PIPE(2)
NAME
pipe, pipe2 - create pipe
SYNOPSIS
#include <unistd.h>
int pipe(int pipefd[2]);
#define _GNU_SOURCE
#include <unistd.h>
int pipe2(int pipefd[2], int flags);
DESCRIPTION
pipe() creates a pipe, a unidirectional data channel that can be used
for interprocess communication. The array pipefd is used to return two
file descriptors referring to the ends of the pipe. pipefd[0] refers
to the read end of the pipe. pipefd[1] refers to the write end of the
pipe. Data written to the write end of the pipe is buffered by the
kernel until it is read from the read end of the pipe. For further
details, see pipe(7).
If flags is 0, then pipe2() is the same as pipe(). The following val
ues can be bitwise ORed in flags to obtain different behavior:
O_NONBLOCK Set the O_NONBLOCK file status flag on the two new open
file descriptions. Using this flag saves extra calls to
fcntl(2) to achieve the same result.
O_CLOEXEC Set the close-on-exec (FD_CLOEXEC) flag on the two new file
descriptors. See the description of the same flag in
open(2) for reasons why this may be useful.
RETURN VALUE
On success, zero is returned. On error, -1 is returned, and errno is
set appropriately.
ERRORS
EFAULT pipefd is not valid.
EINVAL (pipe2()) Invalid value in flags.
pf3
pf4

Partial preview of the text

Download Linux Pipe Function: pipe() and pipe2() and more Study notes Computer Numerical Control in PDF only on Docsity!

PIPE(2) Linux Programmer's Manual PIPE(2)

NAME

pipe, pipe2 - create pipe

SYNOPSIS #include <unistd.h>

int pipe(int pipefd[2]);

#define _GNU_SOURCE #include <unistd.h>

int pipe2(int pipefd[2], int flags);

DESCRIPTION pipe() creates a pipe, a unidirectional data channel that can be used for interprocess communication. The array pipefd is used to return two file descriptors referring to the ends of the pipe. pipefd[0] refers to the read end of the pipe. pipefd[1] refers to the write end of the pipe. Data written to the write end of the pipe is buffered by the kernel until it is read from the read end of the pipe. For further details, see pipe(7).

If flags is 0, then pipe2() is the same as pipe(). The following val ues can be bitwise ORed in flags to obtain different behavior:

O_NONBLOCK Set the O_NONBLOCK file status flag on the two new open file descriptions. Using this flag saves extra calls to fcntl(2) to achieve the same result.

O_CLOEXEC Set the close-on-exec (FD_CLOEXEC) flag on the two new file descriptors. See the description of the same flag in open(2) for reasons why this may be useful.

RETURN VALUE On success, zero is returned. On error, -1 is returned, and errno is set appropriately.

ERRORS EFAULT pipefd is not valid.

EINVAL (pipe2()) Invalid value in flags.

EMFILE Too many file descriptors are in use by the process.

ENFILE The system limit on the total number of open files has been reached.

VERSIONS pipe2() was added to Linux in version 2.6.27; glibc support is avail able starting with version 2.9.

CONFORMING TO pipe(): POSIX.1-2001.

pipe2() is Linux-specific.

EXAMPLE The following program creates a pipe, and then fork(2)s to create a child process; the child inherits a duplicate set of file descriptors that refer to the same pipe. After the fork(2), each process closes the descriptors that it doesn't need for the pipe (see pipe(7)). The parent then writes the string contained in the program's command-line argument to the pipe, and the child reads this string a byte at a time from the pipe and echoes it on standard output.

#include <sys/wait.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h>

int main(int argc, char *argv[]) { int pipefd[2]; pid_t cpid; char buf;

if (argc != 2) { fprintf(stderr, "Usage: %s \n", argv[0]); exit(EXIT_FAILURE); }

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

pipe(pfds);

if (!fork()) { printf(" CHILD: writing to the pipe\n"); write(pfds[1], "test", 5); printf(" CHILD: exiting\n"); exit(0); } else { printf("PARENT: reading from pipe\n"); read(pfds[0], buf, 5); printf("PARENT: read "%s"\n", buf); wait(NULL); } }

The resultant output will be something similar to the following:

PARENT: reading from pipe CHILD: writing to the pipe CHILD: exiting PARENT: read "test"

In this case, the parent tried to read from the pipe before the child writes to it.

When this happens, the parent is said to block , or sleep, until data arrives to be

read. It seems that the parent tried to read, went to sleep, the child wrote and

exited, and the parent woke up and read the data.