《linux网络编程》 -- 【第三天】进程间通信

1.信号
信号可以中断一个进程,而不管它正在作什么工作;
在Linux 系统库bits/signum.h 中对这些信号名作了定义,每个名字代表一个正整数;
系统调用不能被信号打断;
在Linux 中,当一个信号的信号处理函数执行时,如果进程又接收到了该信号,该信号会自动被储存而不会中断信号处理函数的执行,直到信号处理函数执行完毕再重新调用相应的处理函数;
但是如果在信号处理函数执行时进程收到了其它类型的信号,该函数的执行就会被中断;


2.信号类型
l SIGHUP
当终止一个终端时,内核就把这一种信号发送给该终端所控制的所有进程。通常情况下,一个进程组的控制终端是该用户拥有的终端,但不完全是如此。当进程组的首进程结束时,就会向该进程组的所有进程发送这种信号。这就可以保证当一个用户退出使用时,其后台进程被终止,除非有其它方面的安排。
l SIGINT
中断键(一般为Ctrl+C)
2 SIGQUIT
ASCII 码FS,通常为Ctrl+\
3 SIGILL
当一个进程企图执行一条非法指令时,内核就发出这种信号。例如,在没有相应硬件支撑的条件下,企图执行一条浮点指令时,则会引起这种信号的发生。SIGILL 和SIGQUIT一样,也形成非正常终止。
4 SIGTRAP
这是一种由调试程序使用的专用信号。由于他的专用行和特殊性,我们不再对它作进一步的讨论。SIGTRAP 也形成非正常终止。
5 SIGFPE
当产生浮点错误时(比如溢出),内核就发出这种信号,它导致非正常终止。
6 SIGKILL
从一个进程发送到另一个进程,使接收到该信号的进程终止。内核偶尔也会发出这种信号。SIGKILL 的特点是,它不能被忽略和捕捉,只能通过用户定义的相应中断处理程序而处理该信号。因为其它的所有信号都能被忽略和捕捉,所以只有这种信号能绝对保证终止一个进程。
7 SIGALRM
当一个定时器到时的时候,内核就向进程发送这个信号。定时器是由改进程自己用系统调用alarm()设定的。
8 SIGTERM
这种信号是由系统提供给普通程序使用的,按照规定,它被用来终止一个进程。
9 SIGSTOP
这个信号使进程暂时中止运行,系统将控制权转回正在等待运行的下一个进程。
l0 SIGUSR1 和SIGUSR2
和SIGTERM 一样,这两种信号不是内核发送的,可以用于用户所希望的任何目的。
l1 SIGCHLD
子进程结束信号。UNIX 中用它来实现系统调用exit()和wait()。执行exit()时,就向子进程的父进程发送SIGCHLD 信号,如果这时父进程政在执行wait(),则它被唤醒;


3.信号处理
系统调用signal()用于接收一个指定类型的信号,并可以指定相应的方法。
系统库signal.h 中的函数声明如下:
int signal (int sig, __sighandler_t handler);


sig 指明了所要处理的信号类型,它可以取除了SIGKILL 和SIGSTOP 外的任何一种信号。
参数handler 描述了与信号关联的动作,它可以取以下三种值:
1.一个返回值为整数的函数地址。
 此函数必须在signal()被调用前声明,handler 中为这个函数的名字。当接收到一个类型为sig 的信号时,就执行handler 所指定的函数。这个函数应有如下形式的定义:
       int func(int sig);
sig 是传递给它的唯一参数。执行了signal()调用后,进程只要接收到类型为sig 的信号,不管其正在执行程序的哪一部分,就立即执行func()函数。当func()函数执行结束后,控制权返回进程被中断的那一点继续执行。
2. SIG_IGN
 这个符号表示忽略信号。执行了相应的signal()调用好,进程会忽略类型为sig 的信号。
3. SIG_DFL
 这个符号表示恢复系统对信号的默认处理。


4. 在进程间发送信号
kill()在linux 系统库signal.h中的函数声明如下:
 int kill(pid_t pid, int sig);
参数pid 指定了信号发送的对象进程:它可以是某个进程的进程标识符(pid),也可以是以下的值:
如果pid 为零,则信号被发送到当前进程所在的进程组的所有进程;
如果pid 为-1,则信号按进程标识符从高到低的顺序发送给全部的进程(这个过程受到当前进程本身权限的限制,请看后面的解释);
如果pid 小于-1,则信号被发送给标识符为pid 绝对值的进程组里的所有进程。
普通用户的进程只能向具有与其相同的用户标识符的进程发送信号。
只有root 用户的进程能够给任何线程发送信号。


5.alarm函数
函数库unistd.h 中的函数
unsigned int alarm(unsigned int seconds);
参数是以秒为单位给出了定时器的时间。当时间到达的时候,就向系统发送一个SIGARLM 信号。
它能立即返回,并使进程继续执行行,直至指定的延迟时间到达发出SIGALRM信号;
在fork()调用后中,在子进程中失效;
如果要使设置的报警时钟失效,只需要调用:alarm(0);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值