开课吧-预习课程-操作系统入门与系统编程
子进程与父进程
1.我们将以鸣人的螺旋手里剑为例子来带你使用这些新学习的函数。现在请先用fork()给鸣人制造—个影分身吧!不要忘了,鸣人和影分身负责的是制造螺旋丸的不同部分,所以你要把fork()返回的影分身的标识ID存在变量中。
2.现在让我们开始制造螺旋手里剑吧!鸣人的本体将负责性质变化,鸣人的影分身将再一次使用fork()分出一个影分身,之后新的影分身将负责提供查克拉,老的影分身负责查克拉的形态变化。请你用让三个鸣人分别说:“我负责产生查克拉!\n”,“我负责形态变化!\n”,“我负责性质变化!\n”。两个影分身说完就会正常exit()。
3.回到螺旋手里剑的问题,我们知道如果鸣人的第二个影分身没有产生查克拉,那么鸣人和第一个影分身也不能对查克拉使用形态变化和性质变化,因此我们希望第二个影分身先完成;请利用wait()让三个鸣人按顺序说出这三句话:“我负责产生查克拉!\n”,“我负责形态变化!\n”,“我负责性质变化!\n”。另外,如果任何一个影分身失败了,请让鸣人本体说:“可恶,又失败了,再来一次!\n”,并在主函数中返回-1。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
int main() {
printf("%s\n", "我是鸣人!");
int pid = fork();
if(pid != 0){
int status;
int result = wait(&status);
//如果在调用wait()时子进程已经结束, 则wait()会立即返回子进程结束状态值status(exit()的参数):成功则为0, 否则为对应的错误数字
//如果执行成功则返回子进程识别码(PID), 如果有错误发生则返回-1.
//用wait():1.希望子进程一定先完成2.父进程即将退出,为了避免僵尸进程
if(result == -1 || status != 0){
printf("%s\n", "可恶,又失败了,再来一次!");
return -1;
}else{
printf("%s\n", "我负责性质变化!");
}
}else{
int second_pid = fork();
if(second_pid != 0){
int new_status;
int new_result = wait(&new_status);
if(new_result == -1 || new_status != 0){
exit(-1);
}else{
printf("%s\n", "我负责形态变化!");
exit(0);
}
}else{
printf("%s\n", "我负责产生查克拉!");
exit(0);
}
}
return 0;
}