PROC(3)

NAME
proc - process control routines

SYNOPSIS
    #include <proc.h>
    Proc_t* procopen(const char* command, char** argv, char** envv, long* opv, long flags);
    int procfree(Proc_t* proc);
    int procclose(Proc_t* proc);
    int procrun(const char* command, char** argv);

DESCRIPTION
These routines provide a portable interface to process creation and execution. They work on systems with fork(2) and exec(2) as well as on systems with only spawnve(2) or spanwveg(3).

runs command with arguments argv, environment modifications in envv, file descriptor, signal and process group operations in opv and flags in flags.

command is searched for using the environment variable from the calling environment. If command is then the current shell is used (see pathshell(3)). If envv is not then it is a terminated vector of name[=value] strings that are added to the command environment using setenviron(3). If name appears in the parent environment then its value is replaced with the new value. If =value is omitted then name is removed from the child environment. The environment variable is set to contain the pathname for command and will appear at the top of the child environment.

If opv is not then it is a 0-terminated vector of operations to perform. In the following context is a combination of and for the child and parent process context respectively. Valid operations are:

PROC_FD_CLOSE(fd,context)
    The file descriptor fd is closed in context.

PROC_FD_DUP(from,to,context)
    The file descriptor from is dup(2)'d into the file descriptor to in context.

PROC_SIG_DFL(sig)
    The signal handler for sig is set to in the child context.

PROC_SIG_IGN(sig)
    The signal handler for sig is set to in the child context.

PROC_SYS_PGRP(pgid)
    The child process group is set to pgid. pgid may have the following values:

The child process becomes a session leader.

The child process is in the parent process group.

The child process becomes a process group leader.

The child process joins the process group
    pgid.

PROC_SYS_UMASK(mask)
    The child process group file creation mask is set to mask.

flags is the inclusive-or of the following:

argv[-1]
    and argv[0] may be modified. This is an optimization that avoids an environment vector realloc(3) when command is a shell script.

Standard shell
    setup is done for the child process.

Parent process redirection file descriptors are closed on error.

Standard daemon setup is done for the child process.

The child environment is cleared before
    envv is added.

The child effective group id is set to the real group id.

Parent pipe errors are ignored.

The current process is overlaid by
    command if possible (i.e., the fork(2) call is omitted).

Paranoid:
    command is searched using the default standard the child environment variable is set to the default standard; the and modes are set; only is used to execute command if it is a shell script.

If the effective user id is
    then the child real user id is set to and the child real group id is set to the effective group id.

proc.rfd
    is connected to command's standard output.

The child process becomes a session group leader.
    (Equivalent to the opv entry

The child effective user id is set to the real user id.

proc.wfd
    is connected to commands's standard input.

The return value is a pointer to a structure with the following members:

The child process id.

The child process group.

A read file descriptor connected to
    command's standard output.

A write file descriptor connected to
    command's standard input.

If an error occurs then is returned.

waits for the process proc to complete and then closes the command stream proc. The command exit status is returned. is returned if the child portion of failed.

frees the process stream without waiting for command to complete. Presumably some other mechanism will be used to wait for proc.pid.

combines and with the flags and returns the command exit status.

SEE ALSO
popen(3), sfpopen(3), spawnveg(3), system(3)