编写程序实现下列功能:
进程A向进程B发送SIGUSR1信号;
进程B收到信号后,打印字符串“receive SIGUSR1”;
要求用kill函数和signal函数实现以上功能;
信号是比较复杂的通信方式,用于通知进程中某种事件的发生。除了进程间的通信之外,进程还能发送信号给进程本身;每种信号类型都有对应信号处理程序。大多数的信号的系统默认操作是结束进程,当然,进程同样可以向系统请求采取某些代替的操作。
例如:忽略信号、恢复信号的默认操作和执行一个预先设定的信号处理函数。
信号的本质是在软件层次上对进程的中断机制的一种模拟。在原理上,一个进程收到某种信号和处理器收到中断请求是一样的。
信号是所有的进程间的通信机制中唯一一个异步通信机制,可以看作是异步通知。
信号的生命周期如下:
接下来我们通过signal和kill两种方式分别实现进程间的通信。
signal.c
扫描二维码关注公众号,回复:
4628533 查看本文章
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
void fun(int sig)
{
if(sig = SIGUSR1)
printf("Received SIGUSR1!\n");
}
int main()
{
printf("This is A process,mypid is: %d\n",getpid());
signal(SIGUSR1,fun);
pause();
return 0;
}
此运行程序的方式和以往有些许不同,运行结果如下:
因为程序中有pause()语句,那么程序运行到此就会停下知道有信号发送给此进程。
然后新建一个终端,在终端输入kill -SIGUSR 11344,那么第二个进程就会发送SIGUSR1信号给pid为11344的进程,也就是进程A。之后程序输出字符串,进程结束。
接下来利用kill函数完成实验。
kill.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
void fun(int sig)
{
if(sig == SIGUSR1)
printf("Reseived SIGUSR1!\n");
}
int main()
{
int pid;
if(signal(SIGUSR1,fun) < 0)
perror("signal");
pid = fork();
if(pid < 0)
perror("fork");
else if(pid == 0)
{
printf("This is B process!\n");
sleep(2);
}
else
{
printf("This is A process!\n");
if(kill(pid,SIGUSR1) < 0)
perror("kill");
return 0;
}
}
程序运行结果: