(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); }测试结果如下: