linux应用编程----进程间通讯kill

来源:互联网 发布:淘宝达人 怎么查pv 编辑:程序博客网 时间:2024/05/29 08:31


    

    一个进程通过对 signal()的调用来处理其它进程发送来的信号。同时,一个进程也可以向其它的进程发送信号。这一操作是由系统调用 kill()来完成的。 kill()在 linux 系统库 signal.h中的函数声明如下:


        int kill(pid_t pid, int sig);


参数 pid 指定了信号发送的对象进程:它可以是某个进程的进程标识符(pid),也可以
是以下的值:
      如果 pid 为零,则信号被发送到当前进程所在的进程组的所有进程;

     如果 pid 为-1,则信号按进程标识符从高到低的顺序发送给全部的进程(这个过程受到当前进程本身权限的限制,请看后面的解释);


     如果 pid 小于-1,则信号被发送给标识符为 pid 绝对值的进程组里的所有进程。


        需要说明的是,一个进程并不是向任何进程均能发送信号的,这里有一个限制,就是普通用户的进程只能向具有与其相同的用户标识符的进程发送信号。也就是说,一个用户
的进程不能向另一个用户的进程发送信号。只有 root 用户的进程能够给任何线程发送信号。参数 sig 指定发送的信号类型。它可以是任何有效的信号。
由于调用 kill()的进程需要直到信号发往的进程的标识符,所以这种信号的发送通常只在关系密切的进程之间进行,比如父子进程之间。


范例:

#include <signal.h>int ntimes=0;main(){  int pid,ppid;  int p_action(), c_action();  /*  设定父进程的SIGUSR1 */  signal(SIGUSR1,p_action);  switch(pid=fork()) {     case -1: /*fork 失败*/       perror("synchro");     exit(1);     case 0:  /*子进程模块*/     /*  设定子进程的SIGUSR1 */      signal(SIGUSR1,c_action);     /*  获得父进程的标识符 */      ppid=getppid();      for(;;) {         sleep(1);         kill(ppid,SIGUSR1);         pause();     }    /*死循环*/    break;    default: /*父进程模块*/       for (;;) {         pause();         sleep(1);         kill(pid,SIGUSR1);    }    /*死循环*/  }}
p_action(){   printf("Patent caught signal #%d\n",++ntimes);}
c_action(){  printf("Child caught signal #%d\n",++ntimes);}


0 0
原创粉丝点击