xref: /original-bsd/share/doc/psd/05.sysman/1.1.t (revision c3e32dec)
Copyright (c) 1983, 1993
The Regents of the University of California. All rights reserved.

%sccs.include.redist.roff%

@(#)1.1.t 8.1 (Berkeley) 06/08/93

.sh "Processes and protection Host and process identifiers

Each UNIX host has associated with it a 32-bit host id, and a host name of up to 64 characters (as defined by MAXHOSTNAMELEN in <sys/param.h>). These are set (by a privileged user) and returned by the calls: sethostid(hostid) long hostid; hostid = gethostid(); result long hostid; sethostname(name, len) char *name; int len; len = gethostname(buf, buflen) result int len; result char *buf; int buflen; On each host runs a set of processes. Each process is largely independent of other processes, having its own protection domain, address space, timers, and an independent set of references to system or user implemented objects.

Each process in a host is named by an integer called the process id. This number is in the range 1-30000 and is returned by the getpid routine: pid = getpid(); result int pid; On each UNIX host this identifier is guaranteed to be unique; in a multi-host environment, the (hostid, process id) pairs are guaranteed unique. Process creation and termination

A new process is created by making a logical duplicate of an existing process: pid = fork(); result int pid; The fork call returns twice, once in the parent process, where pid is the process identifier of the child, and once in the child process where pid is 0. The parent-child relationship induces a hierarchical structure on the set of processes in the system.

A process may terminate by executing an exit call: exit(status) int status; returning 8 bits of exit status to its parent.

When a child process exits or terminates abnormally, the parent process receives information about any event which caused termination of the child process. A second call provides a non-blocking interface and may also be used to retrieve information about resources consumed by the process during its lifetime. #include <sys/wait.h> pid = wait(astatus); result int pid; result union wait *astatus; pid = wait3(astatus, options, arusage); result int pid; result union waitstatus *astatus; int options; result struct rusage *arusage;

A process can overlay itself with the memory image of another process, passing the newly created process a set of parameters, using the call: execve(name, argv, envp) char *name, **argv, **envp; The specified name must be a file which is in a format recognized by the system, either a binary executable file or a file which causes the execution of a specified interpreter program to process its contents. User and group ids

Each process in the system has associated with it two user-id's: a real user id and a effective user id, both 16 bit unsigned integers (type uid_t). Each process has an real accounting group id and an effective accounting group id and a set of access group id's. The group id's are 16 bit unsigned integers (type gid_t). Each process may be in several different access groups, with the maximum concurrent number of access groups a system compilation parameter, the constant NGROUPS in the file <sys/param.h>, guaranteed to be at least 8.

The real and effective user ids associated with a process are returned by: ruid = getuid(); result uid_t ruid; euid = geteuid(); result uid_t euid; the real and effective accounting group ids by: rgid = getgid(); result gid_t rgid; egid = getegid(); result gid_t egid; The access group id set is returned by a getgroups call*: ngroups = getgroups(gidsetsize, gidset); result int ngroups; int gidsetsize; result int gidset[gidsetsize]; .FS * The type of the gidset array in getgroups and setgroups remains integer for compatibility with 4.2BSD. It may change to gid_t in future releases. .FE

The user and group id's are assigned at login time using the setreuid, setregid, and setgroups calls: setreuid(ruid, euid); int ruid, euid; setregid(rgid, egid); int rgid, egid; setgroups(gidsetsize, gidset) int gidsetsize; int gidset[gidsetsize]; The setreuid call sets both the real and effective user-id's, while the setregid call sets both the real and effective accounting group id's. Unless the caller is the super-user, ruid must be equal to either the current real or effective user-id, and rgid equal to either the current real or effective accounting group id. The setgroups call is restricted to the super-user. Process groups

Each process in the system is also normally associated with a process group. The group of processes in a process group is sometimes referred to as a job and manipulated by high-level system software (such as the shell). The current process group of a process is returned by the getpgrp call: pgrp = getpgrp(pid); result int pgrp; int pid; When a process is in a specific process group it may receive software interrupts affecting the group, causing the group to suspend or resume execution or to be interrupted or terminated. In particular, a system terminal has a process group and only processes which are in the process group of the terminal may read from the terminal, allowing arbitration of terminals among several different jobs.

The process group associated with a process may be changed by the setpgrp call: setpgrp(pid, pgrp); int pid, pgrp; Newly created processes are assigned process id's distinct from all processes and process groups, and the same process group as their parent. A normal (unprivileged) process may set its process group equal to its process id. A privileged process may set the process group of any process to any value.