void fork0()
{
if (fork() == 0) {
printf("Hello from child\n");
}
else {
printf("Hello from parent\n");
}
}
运行结果
进程图
void fork1()
{
int x = 1;
pid_t pid = fork();
if (pid == 0) {
printf("Child has x = %d\n", ++x);
}
else {
printf("Parent has x = %d\n", --x);
}
printf("Bye from process %d with x = %d\n", getpid(), x);
}
进程图
void fork2()
{
printf("L0\n");
fork();
printf("L1\n");
fork();
printf("Bye\n");
}
运行结果
进程图
void fork3()
{
printf("L0\n");
fork();
printf("L1\n");
fork();
printf("L2\n");
fork();
printf("Bye\n");
}
运行结果
进程图
void fork4()
{
printf("L0\n");
if (fork() != 0)
{
printf("L1\n");
if (fork() != 0)
{
printf("L2\n");
}
}
printf("Bye\n");
}
运行结果
进程图
void fork5()
{
printf("L0\n");
if (fork() == 0)
{
printf("L1\n");
if (fork() == 0)
{
printf("L2\n");
}
}
printf("Bye\n");
}
运行结果
进程图
void cleanup(void) {
printf("Cleaning up\n");
}
/*
* fork6 - Exit system call terminates process
* call once, return never
Cleaning up
$ Cleaning up
*/
void fork6()
{
atexit(cleanup);
fork();
exit(0);
}
运行结果
进程图
void fork7()
{
if (fork() == 0) {
/* Child */
printf("Terminating Child, PID = %d\n", getpid());
exit(0);
} else {
printf("Running Parent, PID = %d\n", getpid());
while (1)
; /* Infinite loop */
}
}
运行结果
void fork8()
{
if (fork() == 0)
{
/* Child */
printf("Running Child, PID = %d\n", getpid());
while (1)
; /* Infinite loop */
}
else
{
printf("Terminating Parent, PID = %d\n", getpid());
exit(0);
}
}
运行结果
void fork9()
{
int child_status;
if (fork() == 0)
{
printf("HC: hello from child\n");
exit(0);
}
else
{
printf("HP: hello from parent\n");
wait(&child_status);
printf("CT: child has terminated\n");
}
printf("Bye\n");
}
运行结果
进程图
#define N 5
void fork10()
{
pid_t pid[N];
int i, child_status;
for (i = 0; i < N; i++)
if ((pid[i] = fork()) == 0) {
exit(100+i); /* Child */
}
for (i = 0; i < N; i++) { /* Parent */
pid_t wpid = wait(&child_status);
if (WIFEXITED(child_status))
printf("Child %d terminated with exit status %d\n",
wpid, WEXITSTATUS(child_status));
else
printf("Child %d terminate abnormally\n", wpid);
}
}
运行结果
进程图
void fork11()
{
pid_t pid[N];
int i;
int child_status;
for (i = 0; i < N; i++)
if ((pid[i] = fork()) == 0)
exit(100+i); /* Child */
for (i = N-1; i >= 0; i--) {
pid_t wpid = waitpid(pid[i], &child_status, 0);
if (WIFEXITED(child_status))
printf("Child %d terminated with exit status %d\n",
wpid, WEXITSTATUS(child_status));
else
printf("Child %d terminate abnormally\n", wpid);
}
}
运行结果
fork11的进程图和fork10是一样的,只是fork10调用wait,fork11调用waitpid.
wait(&child_status)相当于调用waitpid(-1, &child_status, 0)
pid = -1是指要等待所有的子进程,pid >0是指等待当前指定的子进程的pid.
if (WIFEXITED(child_status))
printf("Child %d terminated with exit status %d\n",
wpid, WEXITSTATUS(child_status));
WIFEXITED
exit或者return正常终止时,返回值为真
WEXITSTATUS
只有WIFEXITED返回值为真时,即正常状态推出时定义的状态
书上习题
8.2
8.3
8.4