进程间通信(2)

一、消息队列

unix早期通信机制之一的信号能够传送的信息量有限,管道则只能传送无格式的字节流,这无疑会给应用程序开发带来不便。消息队列(也叫做报文队列)则克服了这些缺点。

消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式。
进程可以向其中按照一定的规则添加新消息;另一些进程则可以从消息队列中读走消息。

消息队列分两种:
POSIX消息队列以及系统V消息队列 系统V消息队列目前被大量使用

二、信号

1、在终端使用kill -l命令可以查看各种信号
2、信号是可以被捕捉的,但是有些信号是不能被捕捉,例如kill -9 是不允许被捕捉的。
3、可以用signal函数进行捕捉信号。
4、SIGALRM信号:
可以捕捉SIGALRM信号,用来写定时器
alarm用来倒计时。

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

void handle_signal(int sigNum)
{
	if (sigNum == SIGALRM)
	{
		printf ("hello\n");
		alarm(2);      // 重置定时时间
	}
}

int main()
{	
	signal(SIGALRM, handle_signal);    // 定时信号
	alarm(2);          // 定时2秒
	
	while (1);

	return 0;
}

5、SIGCHLD信号:
子进程在退出之前会向父进程发SIGCHLD信息。
由于在处理僵尸进程的时候不能使用wait这种阻塞型的函数,因此可以捕捉SIGCHLD信号,在子进程要退出的时候,使用waitpid函数采取非阻塞处理子进程。由于信号的函数只会进行一次,一旦有多个子进程退出时无法全部退出,需要while循环来确定子进程全部退出

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

void handle_signal(int sigNum)
{
	pid_t pid;

	while ((pid = waitpid(-1, NULL, WNOHANG)) > 0)
	{
		printf ("处理了一个子进程退出信息,子进程的id = %d\n", pid);
	}
}

int main()
{	
	signal(SIGCHLD, handle_signal);    // 定时信号
	
	
	int i;
	for (i = 0; i < 10; i++)
	{
		pid_t pid = fork();
		if (0 == pid)
			break;
	}
	
	while (1);
	
	


	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值