/*运行时屏幕上交替出现子进程与父进程各打印出的若干条信息*/
/*注意观察出现的交替情况每次可能会不一样,注意观察命令提示符出现的位置*/
#include <stdio.h>
int main()
{
int i;
if ( fork() == 0 ) /*创建新的子进程,并判断是否是子进程*/
{
/* 子进程程序 */
for ( i = 0; i < 1000; i++ )
printf("This is child process %d \n",i);
}
else
{
/* 父进程程序*/
for ( i = 0; i < 1000; i++ )
printf("This is parent process %d \n",i);
}
}
/*实现进程的软中断通信*/
/*按Ctrl+c键,可发送SIGINT信号给当前进程*/
/*使用系统调用fork()创建两个子程序,再用系统调用signal()注册父进程和子进程分别对待从键盘上来的中断信号(SIGINT信号)的行为;当有中断信号后,父进程用系统调用Kill()向两个子进程发出信号,子进程收到信号后分别输出
"Child Processll is Killed by Parent!"
"Child Processl2 is Killed by Parent!"
进程等待两个子进程终止后,输出如下的信息后终止:
"Parent process is Killed!"
*/
#include<stdio.h>
#include<signal.h>
#include <stdlib.h>
int wait_mark;//很明显,从变量名上可以知道这是一个等待标志
void waiting()//很明显,这是一个等待函数,直到wait_mark!=1的时候,就退出无限循环
{
while(wait_mark==1);
}
void stop()//很明显,这时候不清楚这个函数是用来干嘛的
{
wait_mark=0;
}
int main()
{
int p1,p2;//很明显,这是两个信号量
while((p1=fork())==-1);//创建子进程1如出错会进入循环
if(p1==0)//如果成功创建子进程,并且执行子进程
{
printf("I am child process 1 ,I am live!\n");
wait_mark=1;//将等待标志置为1,要干嘛呢?
signal(SIGINT,SIG_IGN);/*SIG_ING代表忽略SIFINT信号,signal(参数1,参数2),参数1是我们要处理的信号,参数2是我们的处理方式(有系统默认,忽略,捕获三种),SIGINT信号通常是用CTRL+C用来发给所有的ForeGround Group的进程的*/
signal(16,stop);//注册16号信号发生后的处理函数为stop,将wait_mark置为0
waiting();//然后发现wait_mark注册时候就能够使得waiting函数无限执行下去了
printf("Child Process 1 is Killed by Parent!\n");/*一般fork()之后,都是先执行父进程的,一旦发送了信号16,那么就推出了waiting()。然后执行exit()也就是杀掉了子进程了*/
exit(0);//0代表正常退出程序
}
else//如果是父进程的,就执行下面这个分支了
{
while((p2=fork())==-1);//创建子进程2如出错会进入循环
if(p2==0)
{
printf("I am child process 2 ,I am live!\n");
wait_mark=1;
signal(SIGINT,SIG_IGN);/*SIG_ING代表忽略SIFINT信号,signal(参数1,参数2),参数1是我们要处理的信号,参数2是我们的处理方式(有系统默认,忽略,捕获三种),SIGINT信号通常是用CTRL+C用来发给所有的ForeGround Group的进程的*/
signal(17,stop);//注册17号信号发生后的处理函数为stop
waiting();//进入了无限的等待之中
printf("Child Process 2 is Killed by Parent!\n");
exit(0);
}
else//执行父进程2
{
wait_mark=1;
signal(SIGINT,stop);//注册SIGINT信号发生后的处理函数
waiting();//进入了无限的等待之中
kill(p1,16);//发送16号信号给p1,很明显16号信号是子进程1的signal函数定义的信号
kill(p2,17);//发送17号信号给p1,很明显17号信号是子进程2的signal函数定义的信号
wait(0);//在没有唤醒的情况下,这个父进程2将会处于等待状态
wait(0);
printf("Parent Process is Killed!\n");
exit(0);
}
}
}
/*使用fork()创建子进程之后,先执行子进程1,然后子进程1进入了循环,这时候执行父进程1,父进程1又使用了fork(),创建了子进程2,执行子进程2,子进程2进入循环,然后执行父进程2,父进程2调用kill()终结了子进程1和子进程2的循环状态*/