10.21 作业控制信号

POSIX.1使用了六个信号来实现作业控制:

  • SIGCHLD 子进程已经停止或者终止
  • SIGCONT 已经停止的进程继续运行
  • SIGSTOP 停止进程信号(不能捕获或者忽略)
  • SIGTSTP 交互式停止信号
  • SIGTTIN 后台进程组成员从控制终端读取
  • SIGTTOU 后台进程组成员向控制终端写出

    除了信号SIGCHLD之外,许多应用程序并不处理上述信号:交互式shell通常会完成处理上述信号的必要的全部工作。当我们输入挂起字符的时候(通常是Control-Z),SIGTSTP被发送到前台进程组的所有进程。当我们告知shell恢复某个作业的运行的时候,shell将会向指定作业中的所有进程发送SIGCONT信号,类似地,如果SIGTTIN或者SIGTTOU被发送到进程,进程默认情况下会被停止,作业控制shell将会识别到这一事件并通知我们。

    在任务控制信号之间还存在一些交互,当四个停止信号(SIGSTOP,SIGTSTP,SIGTTIN,SIGTTOU)中的任何一个产生的时候,任何对于相同进程的处于挂起状态的SIGCONT信号都将被抛弃,类似地,当SIGCONT信号产生的时候,任何对于相同进程处于挂起状态的停止信号都将被丢弃。

    注意,SIGCONT的默认行为是继续运行一个处于停止状态的进程,否则,信号将被忽略,通常情况下,我们不必对此信号做任何处理,当SIGCONT信号被产生的时候,该进程就会继续运行,即是该信号被阻塞或者忽略。

Example

图10.31中的程序阐述了当一个进程处理作业控制的时候的正常的代码序列。该程序只是简单地复制其标准输入到其标准输出,但是在信号处理函数中给出的注释适用于管理屏幕的程序执行的典型动作。

“`#include “apue.h”

define BUFFSIZE 1024

static void sig_tstp(int signo) /signal handler for SIGSTOP/

{

sigset_t mask;

/* … move cursor to lower left corner,reset tty mode … /

/ Unblock SIGSTOP,since it’s blocked while we’re handling it */

sigempty(&mask);

sigaddset(&mask, SIGSTOP);

sigprocmask(SIG_UNBLOCK, &mask, NULL);

signal(SIGTSTP, SIG_DFL); /*reset disposition to default */

kill(getpid(), SIGTSTP);  /*and send the signal to ourself */

/* we won‘t return from the kill until we‘re continued */
signal(SIGTSTP, sig_tstp);

/* ... reset tty mode, redraw screen ... */

}

int main(void)

{

int n;

char buf[BUFFSIZE];

/*
 * only catch SIGTSTP if we‘re running with a jb-control shell.
 */
if(signal(SIGTSTP, SIG_IGN) == SIG_DFL)
{
    signal(SIGTSTP, sig_tstp);
}

while((n = read(STDIN_FILENO, buf, BUFFSIZE) > 0)
{
    if(write(STDOUT_FILENO, buf, n) != n)
    {
        err_sys("write error");
    }
}

if(n < 0)
    err_sys("read error");

exit(0);

}

“`

Figure 10.31 How to handle SIGTSTP

当图10.31中的程序开始运行的时候,仅仅在SIGTSTP信号的处理时SIG_DFL的时候才会去设置捕获信号SIGTSTP,其原因为:

  • 当上述程序被不支持作业控制的的程序启动的时候(比如说/bin/sh),该信号的处理将被设置为SIG_IGN;事实上,shell并不会显示地忽略信号,init设置了三个作业控制信号(SIGTSTP,SIGTTIN,SIGTTOU)的处理方式是SIG_IGN,这一处理被所有登录的shell继承
  • 仅仅只有拥有作业控制的shell才会重置这三个信号的处理方式为SIG_DFL.

    当我们输入挂起信号的时候,进程会收到SIGTSTP信号,并且信号处理函数将被调用,在这个时候,我们将会执行任何与终端相关的处理:比如说移动光标到左下角,恢复终端模式等等,然后在复位其处理方式为默认处理(停止进程)并且解除信号阻塞以后,我们向自身发送相同的信号SIGTSTP。我们必须解除该信号的阻塞因为我们当前正在处理相同信号,系统在其被捕获的时候会自动阻塞信号。在这个时候,系统就会停止进程的运行。后续只有当进程收到SIGCONT信号的时候,才会恢复运行,我们并没有捕获SIGCONT信号,因为SIGCONT信号的默认处理方式是恢复已经停止运行进程的运行,在这个时候,程序将会继续运行就像其刚刚从kill函数返回一样,在程序恢复运行的时候,我们将会复位信号SIGTSTP的处理,并执行任何我们想要的终端处理(比如说,我们可以重绘屏幕)。

来自为知笔记(Wiz)

时间: 2024-10-20 10:22:42

10.21 作业控制信号的相关文章

Daily Scrum 10.21

然后由于服务器端有变化,另外具体IDE已经确定,接下来对已经分配下去的任务做些细节补充: 10.20日晚所有人必须完成AS的配置,统一版本为1.3.2,安卓版本为4.4.0,可视化界面手机为Nexus6.并且上网搜寻AS的教程,了解IDE的布局,各个模块的用处. 今晚林珣玙.仇栋民.刘彦熙必须整理完Bmob平台的开发者文档,下载完SDK.对Bmob的整体工作流程,如何和安卓开发联系这两方面内容了解清楚.另外刘彦熙今晚需要提前完成数据库的关系表设计,并在Bmob平台上建立合理名称的数据表.10.2

高项学员:2015年10月10日作业

高项学员:2015年10月10日作业1.下载<政府采购法实施例例>2015年新发布的,并看一下(这个不用写,下面的是写的)2.沟通管理计划包括哪些内容?3.风险管理中,负面风险. 正向风险的应对策略?4.采购管理中,包括哪些内容?最晚提交时间:2015年10月12日(下次上课前).提交方法:同学们按照要求完成作业,并发布在自己的51CTO博客,并将博文地址以评论的形式发布在老师布置作业的评论区

同侪隐修录&#160;(2016-12-25 23:10:21)转载▼

同侪隐修录 (2016-12-25 23:10:21)转载▼ 标签: 武术史 武学 孙氏拳前辈多隐修者,不仅孙存周先生1949年后基本处于隐修状态,鲜与武术界往来,同辈中武艺高明者如裘徳元.齐公博等先生亦如是.这种隐修的气质在孙门内颇为普遍,及至我辈,同侪中之武艺高明者几乎皆如此,如董岳山.陈垣.牟八爷.驼五爷.肖德昌等,不一而足.即使是以票友自称的侪辈高手,如圆觉和尚.胡六爷.何回子.支一峰.刘子明等先生也是隐修自娱,鲜为人知.其他人如张兆麒.李梦庚.章仲华.关秉之.张烈等先生其为人大体也是此

Clover KextsToPatch 使用方法 2015.10.21

Clover KextsToPatch 使用方法 2015.10.21 前些天,因为 Thinkpad X230 BIOS 白名单限制,给她换了一块 ar9285 无线网卡,只是因为这块网卡正好可以被 Mac OS X 驱动,也正好在 Thinkpad X230 BIOS 白名单之中.给 Clover 配置的时候,为了防止忘记,便记录下来. 因为灵活使用 Clover 成为黑苹果用户的必修课,否则你就只能漫天寻找 kext,寄希望与运气能正确驱动你的硬件了.Clover 中有一个强大的功能 Ke

4.6日第10次作业,,18章风险,19章收尾,20章知识产权,高项,29-田哲琦

4.6日第10次作业,,18章风险,19章收尾,20章知识产权,高项,29-田哲琦 第18章.风险管理 1.风险管理包括哪六个过程?(记)P456 答:1).风险管理规划: 2).风险识别: 3).定性风险分析: 4).定量风险分析: 5).应对计划编制: 6).风险监控: 2.什么是应急计划?请举例.P459 答:应急计划:是指当一项可能的风险事件实际发生时项目团队将采取的预先确定的措施: 例如:当项目经理根据一个新的软件产品开发的实际进展情况,预计到该软件开发成果奖不能及时集成到正在按合同进

10.19 iptables规则备份和恢复 10.20 firewalld的9个zone 10.21

七周五次课 10.19 iptables规则备份和恢复 10.20 firewalld的9个zone 10.21 firewalld关于zone的操作 10.22 firewalld关于service的操作 10.19 iptables规则备份和恢复 10.20 firewalld的9个zone 启动firewalld防火墙,关闭iptables 查看所有的zone和默认的zone 10.21 firewalld关于zone的操作 设置默认zone 设置网卡的zone 10.22 firewal

python 9.21作业

1.列表实例:由字符串创建一个作业评分列表,做增删改查询统计遍历操作.例如,查询第一个3分的下标,统计1分的同学有多少个,3分的同学有多少个等. >>> can=list('1123232323123') >>> can ['1', '1', '2', '3', '2', '3', '2', '3', '2', '3', '1', '2', '3'] >>> can.append(4) >>> can ['1', '1', '2',

10.11作业

一 项目进度管理作业 1 活动资源估算的方法.技术和工具: 1 专家判断 2 多方案分析 3 出版的估算数据 4 项目管理软件 5 自下而上估算 2 活动历时估算的方法.技术和工具: 1 专家判断 2 类比估算 3 参数估算 4 三点估算 5 后备分析 3 制定进度计划的方法.技术和工具: 1 进度网络分析 2 关键路线法 3 进度压缩 4 假设情景分析 5 资源平衡 6 关键链法 7 项目管理软件 8 应用日历 9 调整时间提前与滞后量 10 进度模型 4 项目进度控制的方法.技术和工具: 1

10.30作业.

static属性和方法如何调用: public class p { private String name; private int age; static String city ="A城"; public p(String name,int age) { this.name=name; this.age=age; } public String getInfo() { return "姓名:"+this.name+",年龄:"+this.ag