Linux进程间通信程序设计3----信号通信

信号(signal)机制是Unix系统中最为古老的进程间通信机制,很多条件下可以产生一个信号:

1、用户按某些按键时,产生信号。

2、硬件异常信号:除数为0,无效的存储访问等。

3、进程利用kill函数,将信号发送给另一个进程。

4、用户利用kill命令将信号发送给其他进程。

信号类型:

常用类型:

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

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

SIGKILL:该信号结束接收信号的进程

SIGTERM:kill命令发出的信号

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

SIGSTOP:来自键盘或调试程序的停止执行信号。

信号处理

1、忽略此信号:但SIGKILL和SIGSTOP不能忽略。

2、执行用户希望的动作:通知内核在某种信号产生时,调用一个用户函数,在用户函数中,执行用户希望的处理。

3、执行系统默认动作:对大多数信号的系统默认动作是终止该进程。

信号发送

发送信号的主要函数有kill和raise

区别:kill可以给自己发,也可以给别的进程发。raise函数是向进程自身发送信号。

#include<sys/types.h>

#include<signal.h>

int kill(pid_t pid,int signo)

pid有四种不同情况:

pid>0  将信号发送给进程ID为pid的进程。

pid==0将信号发送给同组的进程。

pid<0将信号发送给其进程组ID等于pid绝对值的进程。

pid==-1将信号发送给所有进程。

int raise(int signo)

 

Alarm

使用该函数,可以设置一个时间值(闹钟时间),当所设置时间到了时,产生SIGALRM信号。如果不捕捉此信号,则默认动作是终止该进程。

#include<unistd.h>

unsigned int alarm(unsigned int seconds):经过SECOND秒后,产生信号SIGALRM

 

Pause

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

#include <uintstd.h>

int pause(void)

只有执行了一个信号处理函数后,挂起才结束。

 

信号处理:

1、使用简单signal函数。

2、使用信号集函数组。

例如:

int main()

{

  printf("Waiting for signal SIGINT or SIGQUIT \n");

      signal(SIGINT,myfunc);

  signal(SIGQUIT,my_func);

  pause();

  exit(0);

}

posted @ 2014-07-14 11:49  liu_ty10  阅读(220)  评论(0编辑  收藏  举报