Linux系统编程之发送信号函数kill和raise实例

signal.h是C标准函数库中的信号处理部分, 定义了程序执行时如何处理不同的信号。信号用作进程间通信, 报告异常行为(如除零)、用户的一些按键组合(如同时按下Ctrl与C键,产生信号SIGINT)。

除了两个信号SIGKILL与SIGSTOP不能被捕获(caught)、阻塞(blocked)或者忽略,其它的信号都可以指定处理函数(handler)。函数kill和raise可以发送信号,其中函数raise发送一个信号给当前进程,函数kill发送一个信号给特定进程。

#include <signal.h>
int kill(pid_t pid, int sig);

#include <signal.h>
int raise(int sig);
raise(sig) == kill(getpid(), sig)

下面用一个实例说明kill函数,父进程向子进程发送SIGUSR1信号,子进程捕获该信息,最后父进程发送SIGINT信息终止子进程,程序结束。

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

void handler(int signo)
{
	time_t t = time(NULL);
	printf("%d\t%s", signo, ctime(&t));
}

int main(void)
{
	pid_t pid = fork();
	
	if(pid < 0)
	{
		// Fork error
		perror("fork error\n");
		return 1;
	}
	else if(pid == 0)
	{
		// Child process
		if(signal(SIGUSR1, handler) == SIG_ERR)
		{
			perror("signal error\n");
			return 1;
		}
		while(1) pause();
		return 0;
	}
	else
	{
		// Parent process
		sleep(1);
		for(int i=0; i<5; i++)
		{
			if(kill(pid, SIGUSR1) != 0)
			{
				perror("kill error\n");
				return 1;
			}
			sleep(5);
		}
		// Kill child process
		kill(pid, SIGINT);
		wait(NULL);
		return 0;
	}
}

运行结果如下:

[ycxie@fedora Workspace]$ gcc killdemo.c -o killdemo
[ycxie@fedora Workspace]$ ./killdemo
10	Wed Nov 14 22:33:32 2018
10	Wed Nov 14 22:33:37 2018
10	Wed Nov 14 22:33:42 2018
10	Wed Nov 14 22:33:47 2018
10	Wed Nov 14 22:33:52 2018

Leave a Reply

Your email address will not be published. Required fields are marked *