您的位置:首页 > 移动开发

[置顶] CSAPP第八章家庭作业参考答案

2018-01-22 15:37 916 查看
(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);
}

测试结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: