summaryrefslogtreecommitdiff
path: root/man3p/popen.3p
diff options
context:
space:
mode:
Diffstat (limited to 'man3p/popen.3p')
-rw-r--r--man3p/popen.3p169
1 files changed, 169 insertions, 0 deletions
diff --git a/man3p/popen.3p b/man3p/popen.3p
new file mode 100644
index 000000000..984e0c839
--- /dev/null
+++ b/man3p/popen.3p
@@ -0,0 +1,169 @@
+.\" Copyright (c) 2001-2003 The Open Group, All Rights Reserved
+.TH "POPEN" P 2003 "IEEE/The Open Group" "POSIX Programmer's Manual"
+.\" popen
+.SH NAME
+popen \- initiate pipe streams to or from a process
+.SH SYNOPSIS
+.LP
+\fB#include <stdio.h>
+.br
+.sp
+FILE *popen(const char *\fP\fIcommand\fP\fB, const char *\fP\fImode\fP\fB);
+\fP
+\fB
+.br
+\fP
+.SH DESCRIPTION
+.LP
+The \fIpopen\fP() function shall execute the command specified by
+the string \fIcommand\fP. It shall create a pipe between the
+calling program and the executed command, and shall return a pointer
+to a stream that can be used to either read from or write to
+the pipe.
+.LP
+The environment of the executed command shall be as if a child process
+were created within the \fIpopen\fP() call using the \fIfork\fP()
+function, and the child invoked the \fIsh\fP
+utility using the call:
+.sp
+.RS
+.nf
+
+\fBexecl(\fP\fIshell path\fP\fB, "sh", "-c",\fP \fIcommand\fP\fB, (char *)0);
+\fP
+.fi
+.RE
+.LP
+where \fIshell path\fP is an unspecified pathname for the \fIsh\fP
+utility.
+.LP
+The \fIpopen\fP() function shall ensure that any streams from previous
+\fIpopen\fP() calls that remain open in the parent
+process are closed in the new child process.
+.LP
+The \fImode\fP argument to \fIpopen\fP() is a string that specifies
+I/O mode:
+.IP " 1." 4
+If \fImode\fP is \fIr\fP, when the child process is started, its file
+descriptor STDOUT_FILENO shall be the writable end of
+the pipe, and the file descriptor \fIfileno\fP(\fIstream\fP) in the
+calling process, where \fIstream\fP is the stream pointer
+returned by \fIpopen\fP(), shall be the readable end of the pipe.
+.LP
+.IP " 2." 4
+If \fImode\fP is \fIw\fP, when the child process is started its file
+descriptor STDIN_FILENO shall be the readable end of the
+pipe, and the file descriptor \fIfileno\fP(\fIstream\fP) in the calling
+process, where \fIstream\fP is the stream pointer
+returned by \fIpopen\fP(), shall be the writable end of the pipe.
+.LP
+.IP " 3." 4
+If \fImode\fP is any other value, the result is undefined.
+.LP
+.LP
+After \fIpopen\fP(), both the parent and the child process shall be
+capable of executing independently before either
+terminates.
+.LP
+Pipe streams are byte-oriented.
+.SH RETURN VALUE
+.LP
+Upon successful completion, \fIpopen\fP() shall return a pointer to
+an open stream that can be used to read or write to the
+pipe. Otherwise, it shall return a null pointer and may set \fIerrno\fP
+to indicate the error.
+.SH ERRORS
+.LP
+The \fIpopen\fP() function may fail if:
+.TP 7
+.B EMFILE
+{FOPEN_MAX} or {STREAM_MAX} streams are currently open in the calling
+process.
+.TP 7
+.B EINVAL
+The \fImode\fP argument is invalid.
+.sp
+.LP
+The \fIpopen\fP() function may also set \fIerrno\fP values as described
+by \fIfork\fP() or \fIpipe\fP() .
+.LP
+\fIThe following sections are informative.\fP
+.SH EXAMPLES
+.LP
+None.
+.SH APPLICATION USAGE
+.LP
+Since open files are shared, a mode \fIr\fP command can be used as
+an input filter and a mode \fIw\fP command as an output
+filter.
+.LP
+Buffered reading before opening an input filter may leave the standard
+input of that filter mispositioned. Similar problems with
+an output filter may be prevented by careful buffer flushing; for
+example, with \fIfflush\fP() .
+.LP
+A stream opened by \fIpopen\fP() should be closed by \fIpclose\fP().
+.LP
+The behavior of \fIpopen\fP() is specified for values of \fImode\fP
+of \fIr\fP and \fIw\fP. Other modes such as \fIrb\fP
+and \fIwb\fP might be supported by specific implementations, but these
+would not be portable features. Note that historical
+implementations of \fIpopen\fP() only check to see if the first character
+of \fImode\fP is \fIr\fP. Thus, a \fImode\fP of
+\fIrobert the robot\fP would be treated as \fImode\fP \fIr\fP, and
+a \fImode\fP of \fIanything else\fP would be treated as
+\fImode\fP \fIw\fP.
+.LP
+If the application calls \fIwaitpid\fP() or \fIwaitid\fP() with a
+\fIpid\fP argument greater than 0, and it still has a stream that
+was called
+with \fIpopen\fP() open, it must ensure that \fIpid\fP does not refer
+to the process started by \fIpopen\fP().
+.LP
+To determine whether or not the environment specified in the Shell
+and Utilities volume of IEEE\ Std\ 1003.1-2001 is
+present, use the function call:
+.sp
+.RS
+.nf
+
+\fBsysconf(_SC_2_VERSION)
+\fP
+.fi
+.RE
+.LP
+(See \fIsysconf\fP() ).
+.SH RATIONALE
+.LP
+The \fIpopen\fP() function should not be used by programs that have
+set user (or group) ID privileges. The \fIfork\fP() and \fIexec\fP
+family of functions (except \fIexeclp\fP() and \fIexecvp\fP()), should
+be used
+instead. This prevents any unforeseen manipulation of the environment
+of the user that could cause execution of commands not
+anticipated by the calling program.
+.LP
+If the original and \fIpopen\fP()ed processes both intend to read
+or write or read and write a common file, and either will be
+using FILE-type C functions ( \fIfread\fP(), \fIfwrite\fP(), and so
+on), the rules for sharing file handles must be observed (see \fIInteraction
+of File Descriptors and Standard I/O Streams\fP ).
+.SH FUTURE DIRECTIONS
+.LP
+None.
+.SH SEE ALSO
+.LP
+\fIpclose\fP() , \fIpipe\fP() , \fIsysconf\fP()
+, \fIsystem\fP() , the Base Definitions volume of IEEE\ Std\ 1003.1-2001,
+\fI<stdio.h>\fP, the Shell and Utilities volume of IEEE\ Std\ 1003.1-2001,
+\fIsh\fP
+.SH COPYRIGHT
+Portions of this text are reprinted and reproduced in electronic form
+from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology
+-- Portable Operating System Interface (POSIX), The Open Group Base
+Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of
+Electrical and Electronics Engineers, Inc and The Open Group. In the
+event of any discrepancy between this version and the original IEEE and
+The Open Group Standard, the original IEEE and The Open Group Standard
+is the referee document. The original Standard can be obtained online at
+http://www.opengroup.org/unix/online.html .