进程间通信---两个重要的信号SIGALRM信号&SIGCLD信号

1、SIGALRM信号

alarm函数实现了定时发送SIGALRM信号的功能。(每一个进程都有一个唯一的计时器)

unsigned int alarm(unsigned int seconds)

参数seconds:设定定时时间,超过这个时间时发送SIGALRM信号
返回值:返回定时器剩余描述

结合一个示例:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>
#include<unistd.h>
#include<signal.h>

static int n=0;
void func(int sig)
{
	n=1;
}
int main()
{
	signal(SIGALRM,func);
	alarm(5);//调用函数,5秒后发送SIGALRM信号
	pause();//挂起进程直到接收到信号
	if(n)
	{
		printf("hava a signal %d\n",SIGALRM);
	}
	exit(0);
}

2、SIGCLD信号(SIGCHID)

当一个子进程退出时,并非马上释放其占用的资源,而是通知其父进程,由父进程进行收尾的工作。在这一过程中,系统将依次产生下列事件。

1)子进程向父进程发送SIGCLD信号,子进程进入僵尸状态。

2)父进程接收到SIGCLD信号,进行处理。

        假设在上述过程中父进程既没有忽略SIGCLD信号,也未捕获该信号进行处理,则子进程将进入僵尸状态。僵尸状态的进程不能被操作系统调用,也没有可执行代码,它只是是占用了进程列表中的一个位置而已。过多的僵尸进程对操作系统是一种消耗。

假设仅有几个僵尸进程不会影响系统的执行,可是假设僵尸进程过多。则将会严重影响系统的执行。因此,在编程过程中应避免产生僵尸进程。有两种主要的处理方法能够避免产生僵尸进程:一是父进程忽略SIGCLD信号;二是父进程捕获SIGCLD信号,在信号处理函数中获取子进程的退出状态。忽略信号的方式比較简单。仅仅须要调用signal(SIGCLD,SIG_IGN)语句就可以完毕。假设要捕获信号并处理。那么设置SIGCLD信号,然后在信号处理函数中调用wait或者waitpid等函数获取子进程的退出状态。

猜你喜欢

转载自blog.csdn.net/ShWe_yayaya/article/details/81738686
今日推荐