实验1:
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
#include<stdlib.h>
int wait_mark;
void waiting(),stop(); //申明信号响应函数
int main(int argc,char *argv[])
{
int p1,p2;
signal(SIGINT,stop); //注册信号及信号响应函数
while((p1 = fork()) == -1); //第一个子进程
if(p1 > 0) //父进程
{
while((p2 = fork()) == -1); //第二个子进程
if(p2 > 0) //父进程中
{
wait_mark = 1; //标志
waiting(); //等待
kill(p1,10); //向p1发送信号SIGUSR1
kill(p2,12); //向p2发送信号SIGUSR2
wait(NULL);
wait(NULL);
printf("Parent process exit!/n");
exit(0);
}
else
{
wait_mark = 1;
signal(12,stop); //注册信号及响应函数
waiting();
lockf(1,1,0); //上锁
printf("child process 2 is killed by parent!/n");
lockf(1,0,0); //解锁
exit(0);
}
}
else
{
wait_mark = 1;
signal(10,stop); //注册信号及响应函数
waiting();
lockf(1,1,0); //上锁
printf("child process 1 is killed by parent!/n");
lockf(1,0,0); //解锁
exit(0);
}
}
void waiting()
{
while(wait_mark != 0); //等于0退出
}
void stop()
{
wait_mark = 0;
}
实验2:
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
#include<stdlib.h>
int pid1,pid2;
int EndFlag = 0;
int pf1 = 0;
int pf2 = 0;
void IntDelete() //信号发送函数
{
kill(pid1,10);
kill(pid2,12);
EndFlag = 1;
}
void Int1() //信号处理函数
{
printf("child process 1 is killed by parent/n");
exit(0);
}
void Int2() //信号处理函数
{
printf("child process 2 is killed by parent!/n");
exit(0);
}
int main()
{
int exitcode;
signal(SIGINT,SIG_IGN); //忽略del和中断信号
signal(SIGQUIT,SIG_IGN);
while((pid1 = fork()) == -1);
if(pid1 == 0) //第一个子进程
{
signal(SIGUSR1,SIG_IGN); //注册信号
pause(); //挂起
exit(0);
}
else
{
while((pid2 = fork()) == -1);
if(pid2 == 0) //第二个子进程
{
signal(SIGUSR2,Int2); //注册信号
pause();
exit(0);
}
else //父进程
{
signal(SIGINT,IntDelete); //注册函数
waitpid(-1,&exitcode,0); //等待任何一个子进程退出
printf("parent process exit/n");
exit(0);
}
}
}
实验3:
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>
#include<signal.h>
pid_t child_pid; //子进程号
void sendf_go() //发送信号函数
{
pid_t pid;
pid = getppid();
kill(pid,SIGUSR1);
}
void sendf_stop() //发送信号函数
{
pid_t pid;
pid = getppid();
kill(pid,SIGUSR2);
}
void c_off() //发送信号函数
{
printf("please get off the bus/n");
kill(getppid(),SIGQUIT);
exit(0);
}
void f_sigusr1() //信号响应函数
{
printf("let's gogogo/n");
}
void f_sigusr2() //信号响应函数
{
printf("stop the bus/n");
}
void sendc_off() //给子进程发送信号
{
// pid_t pid;
// pid = getppid();
kill(child_pid,SIGUSR1);
}
void beybey()
{
printf("beybey/n");
exit(0);
}
int main(int argc,char **argv[])
{
pid_t pid;
if((pid = fork()) == -1)
{
perror("fork");
return -1;
}
else if(pid == 0) //子进程
{
printf("In child process,my ID is %d !!!/n",getpid());
while(1){
signal(SIGINT,sendf_go);
signal(SIGQUIT,sendf_stop);
signal(SIGUSR1,c_off); //注册信号
pause();
}
exit(0);
}
else if(pid > 0) //父进程
{
printf("pid=%d,In father process,my ID is %d/n",pid,getpid());
child_pid = pid;
while(1){
signal(SIGTSTP,sendc_off);
signal(SIGUSR1,f_sigusr1);
signal(SIGUSR2,f_sigusr2);//
signal(SIGQUIT,beybey);//父进程接受到SIGUSR2就退出
pause();
}
exit(0);
}
return 0;
}