Linux IPC 进程间通信——信号signal

Linux IPC 进程间通信——信号signal,第1张

Linux IPC 进程间通信——信号signal

目录

一、相关函数分析

signal函数

 kill函数

raise函数

pause函数

二、实例展示

实例1,signal&alarm&pause

实例2,signal&kill&raise


首先认识几个相关的信号函数,signal、kill、raise、pause。

一、相关函数分析 signal函数

void (*signal(int signum,void(* handler)(int)))(int);

        说明:当前进程收到signum对应的信号之后,会执行handler指向的函数。
        其中signum有

#define SIGHUP         1    
#define SIGINT         2    
#define SIGQUIT         3    
#define SIGILL         4    
#define SIGTRAP         5    
#define SIGIOT         6    
#define SIGABRT         SIGIOT    
#define SIGEMT         7
#define SIGFPE         8    
#define SIGKILL         9    
#define SIGBUS        10    
#define SIGSEGV        11    
#define SIGSYS        12
#define SIGPIPE        13    
#define SIGALRM        14    
#define SIGTERM        15    
#define SIGUSR1        16    
#define SIGUSR2        17    
#define SIGCHLD        18    
#define SIGCLD        SIGCHLD    
#define SIGPWR        19    
#define SIGWINCH    20    
#define SIGURG        21    
#define SIGIO        22    
#define SIGPOLL        SIGIO    
#define SIGSTOP        23    
#define SIGTSTP        24    
#define SIGCONT        25    
#define SIGTTIN        26    
#define SIGTTOU        27    
#define SIGVTALRM    28    
#define SIGPROF        29    
#define SIGXCPU        30    
#define SIGXFSZ        31    

        如果handler不是函数指针,则必须是SIG_IGN(忽略当前的信号)、SIG_DFL(将参数指定的信号重新设为系统预设的信号处理方式)。
        信号发生之后会跳到指定的handler处理函数,系统这时候相当于把signum对应的默认处理方式替换为用户指定的处理方式,等执行完用户自定的处理方式之后,系统会把它替换回来。如果想替换系统原来的默认处理方式可以参考函数sigaction

 kill函数

int kill(pid_t pid,int sig);

        说明:该函数用于向指定的进程pid,发送sig信号编号。
        其中参数pid有以下情景:

pid>0指定的进程号pid=0将信号传给与当前进程相同进程组的所有进程pid=-1将信号传递给系统的所有进程pid<-1将信号传递给进程组识别码为PID绝对值的所有进程

        sig参考上面的signal对应的signum。

raise函数

int raise (int sig);

        说明:向同一进程发送sig编号的信号。它与kill的区别是,raise不可以指定pid,只能指向当前的进程。

pause函数

int pause(void);

        说明:让当前进程暂停(进入睡眠模式)直到被信号中断。

二、实例展示 实例1,signal&alarm&pause

signal注册一个SIG_ALARM处理函数,pause暂停程序返回,等signal处理完后,继续执行

#include 
#include 
#include 
#include 


void alarmHandler(){
	printf("alarmHandler func.n");
}

int main(){
	int ret;
	
	printf("listen signal...n");
	signal(SIGALRM, &alarmHandler);

	ret = alarm(5);
	pause();// wait until signal arrived
	printf("ok ret is %dn", ret);
	return 0;
}

运行结果:

listen signal...
alarmHandler func.
ok ret is 0

实例2,signal&kill&raise

        实例展示kill和raise的使用,通过fork创建一个子进程,父进程用raise发送信号给自己,子进程用kill发送给自己或同组的其它进程,同事我们可以看到子进程继承了父进程的signal函数。

#include 
#include 
#include 
#include 
#include 

void my_func(int sig_no){
	if(sig_no == SIGINT){
		printf("I have get SIGINT pid=%dn", getpid());
	}else if(sig_no == SIGQUIT){
		printf("I have get SIGQUIT pid=%dn", getpid());
	}
}

int main(){
	pid_t pid, ppid, cpid;

	
	printf("Waitting for SIGINT or SIGQUITn");
	signal(SIGINT, my_func);
	signal(SIGQUIT, my_func);

	pid = fork();
	if (pid > 0)
	{
		ppid = getpid();
		printf("parent process pid=%dn", ppid);
		raise(SIGQUIT);
	}else if (pid == 0)
	{
		cpid = getpid();
		printf("chlid process pid=%dn", cpid);
		sleep(1);
		kill(0, SIGINT);
		//kill(ppid, SIGINT);
		//kill(cpid, SIGINT);
		//raise(SIGQUIT);
	}
	pause();
	exit(0);
	
}

运行结果

Waitting for SIGINT or SIGQUIT
parent process pid=111605
I have get SIGQUIT pid=111605
chlid process pid=111606
I have get SIGINT pid=111606
I have get SIGINT pid=111605

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5703087.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存