进程间的通信

进程间的通信就麻烦一些了,信号的种类就有64种,可以在终端中输入kill -l查看!

就先说几个今天刚学的吧

1.SIGINT,这个信号是由硬件产生的,比如按下ctrl+c时就会产生这个信号。

2.SIGALRM,这个信号是由alrm(unsigned int arg)函数产生的,就是间隔arg秒时间后产生SIGALRM信号。

3.SIGCHLD.子进程退出时会产生这个信号。


信号产生后必须有一个函数去接这个信号,这个函数就是signal(int signum,sighandler_t handler)函数。第一个参数是信号类型,比如SIGINT.第二个参数是执行方式,执行方式有3种,SIG_IGN表示忽略信号,SIG_DFL表示按默认执行,还有就是可以填执行函数的入口地址.

必须注意!!!对信号的注册函数signal必须在信号产生之前就已经注册好,还有就是pause()函数可以等待信号的产生.然后再执行后面的代码.


这里就只写一个简单的例子吧

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

void some_signal(int sig)
{

	if (sig == SIGINT)
		printf("the ctrl+c signal\n");
	else if (sig == SIGALRM)
		printf("alrm signal\n");
	else
		printf("chile end signal\n");
}

int main()
{
	pid_t pid;
	int i;
	pid = fork();
	switch (pid)
	{
		case -1:
			perror("fork failed!\n");
			exit(0);
		case 0:
				
			signal(SIGALRM,some_signal);
			sleep(1);	
			alarm(1);
			pause();
			break;
		default:
			

			signal(SIGINT,some_signal);
			signal(SIGCHLD,some_signal);

			pause();
			wait(NULL);
	}
	return 0;
}

正常运行,会打印
alrm signal
chile end signal
如果在子进程结束之前按ctrl+c就会打印


the ctrl+c signal

这里要注意,在一个进程中用alarm函数,在另一个进程中是收不到信号的,当然不是说SIGALRM不能在不同进程间传递,而是alarm这个函数的原因,如果在子进程用kill(getppid,SIGALRM),父进程signal(SIGALRM,function)就能收到.



你可能感兴趣的:(c,function,kill,null,终端,Signal)