Brief Introduction to System
Calls and Process
Management
COMP 229, 346, 444, 5201
Revision 1.3
July 21, 2004
March 1, Serguei A. Mokhov, 1
Overview
• System Call Interface
• Process Management with C
– fork()
– exec()
– wait()
– exit()
March 1, Serguei A. Mokhov, 2
System Call Interface
App Software
User-run
API ning
syscall - trap
Sys Software
“You are here” Kernel-ru exit()
Sys Call (OS) Interface
Zombie
nning
read(), write(),
OS wait(), sleep()
Sw-Hw I-face (drivers) Block
Ready
ed
Hardware
March 1, Serguei A. Mokhov, 3
The fork() System Call (1)
• A process calling fork() spawns a child
process.
• The child is almost an identical clone of the
parent:
– Program Text (segment .text)
– Stack (ss) #include <sys/types.h>
– PCB (eg. registers) #include <unistd.h>
– Data (segment .data) pid_t fork(void);
March 1, Serguei A. Mokhov, 4
The fork() System Call (2)
• The fork() is one of the those system calls,
which is called once, but returns twice!
• After fork() both the parent and the child are
executing the same program. Consider a piece of program
(see fork_pid.c example):
• On error, fork() returns -1 ...
pid_t pid = fork();
PID=28 PID=28 PID=34 printf(“PID: %d\n”, pid);
...
fork()
The parent will print:
PID: 34
p1 p1 c1 And the child will always print:
PID: 0
March 1, Serguei A. Mokhov, 5
The fork() System Call (3)
• Remember, after fork() the execution
order is not guaranteed.
• Simple fork() examples:
– fork_pid.c prints
out return from fork()
– fork_child.c distinguishes between the parent
and the child
March 1, Serguei A. Mokhov, 6
The exec()System Call (1)
• The exec() call replaces a current process’ image with a new one
(i.e. loads a new program within current process).
• The new image is either regular executable binary file or a shell script.
• There’s no a syscall under the name exec(). By exec() we usually
refer to a family of calls:
– int execl(char *path, char *arg, ...);
– int execv(char *path, char *argv[]);
– int execle(char *path, char *arg, ..., char *envp[]);
– int execve(char *path, char *argv[], char *envp[]);
– int execlp(char *file, char *arg, ...);
– int execvp(char *file, char *argv[]);
• Here's what l, v, e, and p mean:
– l means an argument list,
– v means an argument vector,
– e means an environment vector, and
– p means a search path.
March 1, Serguei A. Mokhov, 7
The exec()System Call (2)
• Upon success, exec() never returns to the caller. If it does return, it
means the call failed. Typical reasons are: non-existent file (bad path)
or bad permissions.
• Arguments passed via exec() appear in the argv[] of the main()
function.
• For more info: man 3 exec;
• Example: exec_pid.c
PID=28 PID=28
exec()
p1 p1
Old
Legend: Program
New
Program
March 1, Serguei A. Mokhov, 8
Environment
• The e-exec calls use the environment when attempt to invoke a new
program.
• Name = Value
– HOME
– PATH
– SHELL
– USER
– LOGNAME
– ...
• set or env - will display current environment, which you can modify
with:
– the export command in a shell or a shell script (bash);
– the setenv for tcsh
– the getenv(), setenv(), putenv(), etc. in C
March 1, Serguei A. Mokhov, 9
fork() and exec() Combined
• Often after doing fork() we want to load
a new program into the child. E.g.: a shell.
tcsh tcsh tcsh
PID=28 PID=28 PID=34
fork()
p1 p1 c1
tcsh ls
PID=34 PID=34
exec(ls)
c1 c1
March 1, Serguei A. Mokhov, 10
The System wait() Call
• Forces the parent to suspend execution, i.e.
wait for its children or a specific child to die
(terminate is more appropriate terminology,
but a bit less common).
• Example: fork_exec.c
March 1, Serguei A. Mokhov, 11
The System wait() Call (2)
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);
• The wait() causes the parent to wait for any child process.
• The waitpid() waits for the child with specific PID.
• The status, if not NULL, stores exit information of the child,
which can be analyzed by the parent using the W*() macros.
• The return value is:
– PID of the exited process, if no error
– (-1) if an error has happened
March 1, Serguei A. Mokhov, 12
The exit() System Call
#include <stdlib.h>
void exit(int status);
• This call gracefully terminates process execution. Gracefully
means it does clean up and release of resources, and puts the
process into the zombie state.
• By calling wait(), the parent cleans up all its zombie children.
• exit() specifies a return value from the program, which a
parent process might want to examine as well as status of the
dead process.
• _exit() call is another possibility of quick death without
cleanup.
March 1, Serguei A. Mokhov, 13
Process Overview
INIT
PID=1
User-run
ning
syscall() - trap
Kernel-ru exit()
Zombie
nning
wait() ?
Block
Ready
ed
March 1, Serguei A. Mokhov, 14
References
• man 2 fork
• man 3 exec
• man 2 wait
• man 3 exit
March 1, Serguei A. Mokhov, 15