进程间的通信(一)

编写程序实现下列功能:

进程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;
	}
}

程序运行结果:

猜你喜欢

转载自blog.csdn.net/Wangguang_/article/details/84933760