Linux下的进程与线程(二)—— 信号

Linux进程之间的通信:

本文主要讨论信号问题。

在Linux下的进程与线程(一)中提到,调度器可以用中断的方式调度进程

然而,进程是怎么知道自己需要被调度了呢?是内核通过向进程发送信号,进程才得以知道的。

Linux系统的进程之间是通过信号来通信的。

程序员在Shell上显式地发送信号使用的是kill命令,原型如下:

kill -sigid [-]pid

其中, sigid指示的是信号的id,pid前若有-,则pid代表的为进程组id,否则pid代表的为进程id

kill函数也有相同的作用,原型如下:

int kill(pid_t pid, int sig);

一个使用kill命令的典型例子如下:

我们在Linux的Shell上运行一个前台作业的时候,Shell会fork一个新的进程A,然后在这个新的进程中运行我们的作业。该前台作业在运行时也可能会fork子进程a,子进程b。

当我们按下Ctrl+C,Shell会收到一个SIGINT信号,然后Shell进程会转发这个信号到A,然后A再将这个信号转发到子进程a,子进程b。

通过这种转发的方式,实现信号传递。

下图摘自CS:APP(图8-27),在本书的举例中,前台作业运行的是 ls | sort,图示一目了然:

值得一提的是,当父进程创建子进程之后,父子进程的进程组ID(pgid)是相同的。

信号的等待与阻塞

如果一个进程正在处理类型为k的信号,那么此时当另一个k信号到的时候,进程的pending位向量(待处理信号集)的第k位会被设置。但这个刚到的k信号不会被立即处理,直到handler程序返回。

如果此时来了一个k信号,那么由于此前pending位向量已被设置,所以这个信号会被丢弃

一旦进程接收了信号k,那么内核就会清除pending的第k位。

blocked位向量(被阻塞信号集)维护着进程阻塞的信号,在这里设置的信号不会被进程接收处理。

所以我们知道,pending & ~blocked 的结果指示了进程将要去接收处理的信号集。

信号中断慢速系统调用

诸如read,wait,accept之类的慢速系统调用会阻塞进程,在特定的Solaris系统上,当被阻塞的进程被信号中断之后,将不会再返回。而是给用户一个错误条件,并对errno进行设置。

在Linux系统上,会自动重启被中断的系统调用.

为了使得编写的代码在Linux和Solaris系统上都能运行,需编写可移植性代码.

接收信号

进程接收每一个信号之后都有默认的行为,比如接收SIGKILL信号后,进程被终止。

可以设置signal函数,来修改部分信号的默认行为:

sighandler_t signal(int signum, sighandler_t handler)

其中,signum为要捕获的信号,handler为捕获信号后要执行的函数名称。

 

转载于:https://www.cnblogs.com/geeklove01/p/7932835.html

1. 在linux下编写一个应用程序,命名为an_ch2_1b。这个程序不断地输出如下行:Those output come from child,[系统时间] 另外写一个应用程序,命名为an_ch2_1a。这个程序创建一个子进程,执行an_ch2_1b。这个程序不断地输出如下行: Those output come from child,[系统时间] 观察程序运行的结果,并对你看到的现象进行解释。 2. 在linux环境下编写一个控制台应用程序,程序中有一个共享的整型变量shared_var,初始值为0;创建一个线程并使其立即与主线程并发执行。新创建线程与主线程 均不断地循环,并输出shared_var 的值。主线程在循环中不断地对shared_var 进行加1操作,即每次循环shared_var 被加1;而新创建线程则不断地对shared_var 进行减1 操作,即每次循环shared_var 被减1。观察程序运行的结果,并对你看到的现象进行解释。 理发师问题的描述:一个理发店接待室有n张椅子,工作室有1张椅子;没有顾客时,理发师睡觉;第一个顾客来到时,必须将理发师唤醒;顾客来时如果还有空座的话,他就坐在一个座上等待;如果顾客来时没有空座了,他就离开,不理发了;当理发师处理完所有顾客,而又没有新顾客来时,他又开始睡觉。 1. 实现一个“difftree”命令,其功能是比较两个目录下的文件结构和文件信息。当在命令行方式下执行“difftree ”命令时,能够比较目录dir1和 目录dir2是否具有相同的结构,对相同的部分,进一步比较相同文件名的文件内容。列出比较的文件系统结构图。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值