fork函数解析

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
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值