linux信号通信

1.信号是unix系统中最基础的进程间通信机制,有以下情况可以产生信号:

1.1.当用户按某些按键时产生信号;

1.2.硬件异常产生信号(除数为零,无效的存储访问等等);

1.3.进程用kill函数将信号发送给另一个进程

1.4.用户用kill命令将信号发送给其他进程

2.常见信号类型:

SIGHUP:从终端上发出的结束信号

SIGINT:来自键盘的中断信号(Ctrl-C)

SIGKILL:结束接收信号的进程

SIGTERM:kill命令发出的信号

SIGCHLD:标识子进程停止或结束的信号

SIGSTOP:来自键盘或调试程序的停止信号(Ctrl-Z)

3.信号发送

3.1kill函数:

#include<sys/types.h>#include<signal.h>int kill(pid_t pid,int signum)

可以向进程自身发送信号,也可以向其他进程发送信号。

pid>0,将信号发送给进程ID为pid的进程;pid==0,将信号发送给同组进程;pid<0,将信号发送给进程组id等于pid绝对值的进程;pid==-1,将信号发送给所有进程。

3.2raise函数

#include<sys/types.h>#include<signal.h>int raise(int signum)

只能向进程自身发送信号

3.3alarm函数

#include<unistd.h>unsigned int alarm(unsigned int seconds)

设置一个时间值seconds,当经过seconds秒后,产生SIGALARM信号,如果不捕捉此信号,系统默认结束该进程。每个进程只能有一个alarm时间,新的alarm时间将更新旧的alarm时间;当seconds被设置为0,表示关闭alarm操作。

3.4pause函数

#include<unistd.h>int pause(void)

使调用的进程挂起直至捕捉到一个信号。

4.信号处理

4.1忽略信号:大多数信号都按这种方式进行处理,但SIGKILL和SIGSTOP不能被忽略。

4.2执行用户希望的动作:通知内核在某种信号发生时调用一个用户函数。

4.3执行系统默认的操作:对大多数信号的系统默认操作时终止该进程。

信号处理的主要方法有两种,一种使用signal函数,一种使用信号集函数组。

4.4signal函数

#include<signal.h>void (*signal(int signum,void(*func)(int)))(int)

==>>

typedef void (*sighandler_t)(int) //函数指针sighandler_t signal(int signum,sighandler_t handler)

func可以是:

SIG_IGN:忽略此信号

SIG_DFL:使用系统默认方式

信号处理函数名:使用该函数(handler)处理,如下:

#include <signal.h>#include <stdio.h>#include <stdlib.h>/*自定义信号处理函数*/void my_func(int sign_no){if(sign_no==SIGBUS)printf("I have get SIGBUS\n");}int main(){printf("Waiting for signal SIGBUS \n ");/*注册信号处理函数*/signal(SIGBUS,my_func);pause();//将进程挂起直到捕捉到信号为止exit(0);}

学习会使你永远立于不败之地。

linux信号通信

相关文章:

你感兴趣的文章:

标签云: