操作系统课做了关于进程间通信的实验,做完以后有挺多感慨的,这里分享一下。
(1)进程的创建
基本思路:父进程fork出两个子进程,wait(0)等待子进程分别输出”child1”,”child2”后再输出parent.
代码:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>
int main(){
int pid;
while((pid=fork())==-1); //这么做保证子进程一定会创建
if(!pid){ //子进程1
printf("Child1\n");
exit(0);
}
else{
while((pid=fork())==-1);
if(!pid){ //子进程2
printf("Child2\n");
exit(0);
}
else{ //父进程
wait(0);//等待任意一个子进程死亡
wait(0);
printf("Parent\n");
exit(0);
}
}
}
运行结果
其实这里有一个bug,就是不同的机器下运行的结果可能不同,有可能你的机器上看你到的就是Child2在Child1前面。这是因为我们不能确定fork()之后cpu要调度哪个进程。所以能有以上的运行结果可以说是巧合,放到别人的机器上很可能就不是这样了。如果我们要实现无论什么机器上运行上述并发程序都能呈现这样的结果,就需要借助下面实验要用到的signal函数。
(2)进程间通信
实验要求:
①编制一个程序,使其实现进程的软中断通信。 要求:使用系统调用 fork()创建两个子进程,再用系统调用 signal()让父进程捕捉键盘 上来的中断信号(即 DEL 键);当捕捉到中断信号后,父进程用系统调用 kill()向两个子进 程发出信号,子进程捕捉到信号后分别输出下列信息后终止: Child Process 1 is Killed by Parent! Child Process 2 is Killed by Parent! 父进程等待两个子进程终止后,输出如下信息后终止: Parent Process is killed!
②在上面的程序中增加语句 signal(SIGIN