CSAPP第八章家庭作业参考答案

(CSAPP第三版系列)导航篇传送门


8.12 这个程序会输出多少个“hello”输出行?

分析该程序doit()函数的行为,4个进程都会再返回到主程序,所以程序会输出8个“hello”输出行。


8.16 下面这个程序的输出是什么?

分析该程序,子进程将count减一,父进程将其加一后输出,所以输出是: counter = 1。

 

8.20使用execve编写一个叫做myls的程序,该程序的行为和/bin/ls程序的一样。

程序如下:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc,char *argv[],char *envp[])
{
	if(execve("/bin/ls",argv,envp) == -1)
		printf("execve error!\n");
	return 0;
}
测试结果如下:


8.24 修改图8-18中的程序。

程序如下:

#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#define N 2

int main()
{
	int status,i;
	pid_t pid;
	for(i = 0;i < N;i++)
		if((pid = fork()) == 0)
		{
			int *pt = 0x0;
			*pt = 15213;
			exit(100+i);
		}		
	while((pid = waitpid(-1,&status,0)) > 0)
	{
		if(WIFEXITED(status))
			printf("child %d terminated normally with exit status = %d\n",pid,WEXITSTATUS(status));
		else if(WIFSIGNALED(status))
		{
			fprintf(stderr,"child %d terminated by signal %d",pid,WTERMSIG(status));
			psignal(WTERMSIG(status)," ");
		}
		else
			printf("child %d terminated abnormally\n",pid);
	}
	if(errno != ECHILD)
		printf("waitpid error\n");
	exit(0);
}
测试结果如下:





猜你喜欢

转载自blog.csdn.net/qq512028505/article/details/79129560
今日推荐