基本进程通信--信号
作者 佚名技术
来源 Linux系统
浏览
发布时间 2012-05-18
信号是进程之间通信的另外一种方式.之前用过kill -l看了Linux系统支持的所有信号,这些信号在sys/signal.h中定义,系统支持64种信号.除了系统内核和root之外,只有具备相同uid、gid的进程才可以使用信号进行通信.
gaolu@gaolu-desktop:~$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT //本次程序提到信号 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN 1 36) SIGRTMIN 2 37) SIGRTMIN 3 38) SIGRTMIN 4 39) SIGRTMIN 5 40) SIGRTMIN 6 41) SIGRTMIN 7 42) SIGRTMIN 8 43) SIGRTMIN 9 44) SIGRTMIN 10 45) SIGRTMIN 11 46) SIGRTMIN 12 47) SIGRTMIN 13 48) SIGRTMIN 14 49) SIGRTMIN 15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX gaolu@gaolu-desktop:~$ 1、信号的产生 (1)kill函数 函数调用形式为int kill(pid_t pid,int sig),表示向进程pid发送信号sig.这个函数之前用过,不再介绍. 函数执行成功返回0,失败返回-1. (2)raise函数 该函数用于给调用进程自身发送信号,调用形式为int raise(int sig);等同与调用kill(getpid(),sig). 函数执行成功返回0,失败返回非零数值. (3)alarm函数 该函数用于给进程设置告警时钟,时钟(单位为秒)到达后,给进程发送SIGALARM信号.默认处理方式为进程直接终止运行,也可以修改捕捉信号后的默认处理函数. 拥有帝国一切,皆有可能。欢迎访问phome.net【程序实例】 //连续创建5个子进程,分别给5个子进程设置告警时钟1-5秒,时钟到达时,捕捉到SIGALARM信号,采用默认处理方式,直接终止执行;捕捉到信号之前用pause挂起进程,使其处于等待状态;捕捉信号以后的默认处理就是终止,因此不需要显式的调用_exit等函数. 父进程等待所有的子进程结束,根据wait到的status,调用宏判断是属于正常退出(打印退出码),还是接受到信号退出(打印接收到的信号值). #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> int main(void) { int status,i; pid_t pid,wait_pid; for(i=1;i<=5;i ) { pid = fork(); if(pid<0) { perror("Creat child process failed.n"); return 1; } if(pid == 0) { printf("Child process %ld will terminal after %d seconds.n",(long)getpid(),i); alarm(i); pause(); } } while((pid = wait(&status))&&pid!=-1) { if(WIFSIGNALED(status)) { printf("Process %d exit because of receiving signal %d.n",pid,WTERMSIG(status)); } if(WIFEXITED(status)) { printf("Process %d exit code %d.n",pid,WEXITSTATUS(status)); } } return 0; } 执行结果: gaolu@gaolu-desktop:~$ gaolu@gaolu-desktop:~$ gcc -o sig systemcall2.c gaolu@gaolu-desktop:~$ ./sig Child process 5757 will terminal after 1 seconds. Child process 5758 will terminal after 2 seconds. Child process 5759 will terminal after 3 seconds. Child process 5760 will terminal after 4 seconds. Child process 5761 will terminal after 5 seconds. Process 57 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
关于基本进程通信--信号的所有评论