linux进程间通信-信号通信

      • 用户进程队信号的响应方式
      • 信号发送
        • kill和raise
        • alarm和pause
      • 信号的处理
        • 使用signal

信号是软件层次上对中断机制的模拟,异步通信。
可以直接进行用户空间进程和内核进程之间的通信内核通过信号通知用户发生的系统事件。

用户进程队信号的响应方式:

  • 忽略:(除了SIGKILL,SIGSTOP)
  • 捕捉信号:定义差信号处理函数,当信号发生时,执行相关处理函数;
  • 执行默认操作;

信号发送:

1. kill和raise

int kill(pid_t pid, int sig);   //向指定进程发送信号

pid: 指定要来接收信号的进程号;
sig: 信号(可以通过kill -l 来查看可用的信号列表);
return: 0—Success, -1—-Error;

int raise(int sig); //向当前进程(自己)发送信号

2. alarm和pause

uint alarm(uint seconds);       //设置定时器,时间到时,内核向进程发送SIGALARM信号。

return:
success —0或者如果在调用alarm前已经设置了时间,否则返回上个闹钟的剩余时间;
fail — -1;

int pause(void);    //将调用它的进程挂起,直到收到信号为止

信号的处理

处理方式:
1. 使用简单的signal();
2. 使用信号集函数族;

1. 使用signal()

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

signum:指定的信号
handler:处理函数(三种方式):

①SIG_IGN:忽略;
②SIG_DFL:按默认操作;
自定义的函数指针,注意是函数的指针

例如:

void myfun();   //假设以定义好
...
signal(SIGQUIT,myfun);  
//这样当发生SIGQUIT信号时,回调用myfun(),而不是按系统默认的处理方式:退出结束当前进程。

你可能感兴趣的:(linux高级)