`

作业控制信号

阅读更多
    POSIX.1 认为有以下 6 个与作业控制有关的信号。
    * SIGCHLD:子进程已停止或终止。
    * SIGCONT:如果进程已停止,则使其继续运行,否则忽略。
    * SIGSTOP:停止信号(不能被捕捉或忽略)。
    * SIGTSTP:交互式停止信号。
    * SIGTTIN:后台进程组成员读控制终端。
    * SIGTTOU:后台进程组成员写控制终端。
    除 SIGCHLD 以外,大多数应用程序并不处理这些信号,交互式 shell 则通常会处理这些信号的所有工作。当键入挂起字符(通常是 Ctrl+Z)时,SIGTSTP 就被送至前台进程组的所有进程;当通知 shell 在前台或后台恢复运行一个作业时,shell 就向该作业中的所有进程发送 SIGCONT 信号。当对一个停止的进程产生一个 SIGCONT 信号时,该进程就继续,即使该信号是被阻塞或忽略的。
    下面这个程序演示了当一个程序处理作业控制时通常所使用的规范代码序列。该程序只是将其标准输入复制到标准输出,而在信号处理程序中以注释形式给出了管理屏幕的程序(如 VI)所执行的典型操作。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>

#define BUFFER	1024

static void sig_tstp(int signo){	// signal handler for SIGTSTP
	/* ... move cursor to lower left corner, reset tty mode ... */

	/* Unblock SIGTSTP, since it's blocked while we're handling it */
	sigset_t mask;
	sigemptyset(&mask);
	sigaddset(&mask, SIGTSTP);
	sigprocmask(SIG_UNBLOCK, &mask, NULL);

	signal(SIGTSTP, SIG_DFL);		// reset disposition to default
	printf("send SIGTSTP\n");
	kill(getpid(), SIGTSTP);		// and send the signal to ourself
	printf("received SIGCONT\n");

	/* We won't return from the kill untill we're continued */

	signal(SIGTSTP, sig_tstp);		// reestablish signal handler

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

int main(void){
	ssize_t	n;
	char buf[BUFFER];

	/* Only catch SIGTSTP if we're running with a job-control shell */
	if(signal(SIGTSTP, SIG_IGN) == SIG_DFL)
		signal(SIGTSTP, sig_tstp);
	while((n=read(STDIN_FILENO, buf, BUFFER)) > 0){
		if(write(STDOUT_FILENO, buf, n) != n)
			printf("write error\n");
	}
	if(n < 0)
		printf("read error\n");
	exit(0);
}

    这里仅当 SIGTSTP 信号的配置是 SIG_DFL 时才安排捕捉该信号的理由是:init 会将 SIGTSTP、SIGTTIN 和 SIGTTOU 设置为 SIG_IGN,这种配置将被所有登录 shell 继承。所以当此程序由不支持作业控制的 shell(如 /bin/sh)启动时,此信号的配置将被设置为 SIG_IGN。只有作业控制 shell 才应将这 3 个信号重新设置为 SIG_DFL。
    程序运行结果如下。
$ ./jobCtrlDemo.out
abcde                                      # 读取输入
abcde                                      # 输出
^Zsend SIGTSTP                             # Ctrl-Z 发送 SIGTSTP 信号挂起进程
[1]+  Stopped                 ./jobCtrlDemo.out
$ ps                                       # 查看进程 ID
   PID TTY          TIME CMD
 23893 pts/1    00:00:00 jobCtrlDemo.out
 23914 pts/1    00:00:00 ps
 82002 pts/1    00:00:05 bash
$ 
$ kill -SIGCONT 23893                      # 发送 SIGCONT 信号使进程继续运行
received SIGCONT
[1]+  Stopped                 ./jobCtrlDemo.out

    当键入挂起字符时,进程接到 SIGTSTP 信号,然后调用该信号处理程序。此时,应当进行与终端有关的处理(如将光标移到左下角、恢复终端工作方式等)。在将 SIGTSTP 重置为默认值(停止该进程),并解除了对此信号的阻塞(因为正在捕捉一个信号期间系统会自动地阻塞该信号)后,进程向自己发送同一信号 SIGTSTP,使系统停止该进程。仅当该进程接到 SIGCONT 信号后才会如同从 kill 函数返回一样继续运行。最后再将 SIGTSTP 重置为捕捉,并做一些终端处理工作(如重新绘制屏幕)。
分享到:
评论

相关推荐

    信号与系统大作业(基于MATLAB).docx

    《信号与系统大作业——基于MATLAB的常系数线性差分方程解法探讨》 常系数线性差分方程在信号处理与系统分析领域具有核心地位,它能够有效地描述离散时间系统的动态特性。这篇论文旨在深入研究差分方程的多种解法,...

    基于初次控制信号提取的迭代学习控制方法.docx

    在实际应用中,如数控机床和工业机器人的作业,往往存在许多类同或相似的任务,如果能从历史作业数据中提取出对新任务有用的初次控制信号,就能显著减少学习过程,提升初次迭代的精度。 文献中提到的研究主要集中在...

    高空作业车智能控制器的设计与开发

    为了提升高空作业车的作业性能,降低操作人员的劳动强度,并提高作业安全性和精确度,全剑敏等作者设计了一款高空作业车智能控制器。该控制器旨在解决传统高空作业车操作中的问题,传统作业依赖操作人员的视觉反馈,...

    操作系统实验三:实现作业控制语言.

    在本次"操作系统实验三:实现作业控制语言"中,我们将深入学习并实践操作系统的一些关键概念和技术。 首先,实验的目标是将操作系统分为两个主要部分:引导程序和内核。引导程序是系统启动时执行的第一段代码,它的...

    现代控制理论大作业.zip

    在这个大作业中,你需要利用MATLAB完成以上所有步骤,包括系统建模、能控能观性分析、稳定性评估、状态反馈控制器设计以及SIMULINK仿真。这不仅要求你掌握现代控制理论的基本原理,还需要熟练应用MATLAB工具进行实际...

    哈尔滨工业大学实验学院07级机电控制技术大作业

    在机电控制系统中,逻辑图能清晰描绘出传感器如何将物理量转换为电信号,控制器如何根据这些信号作出决策,以及执行机构如何响应控制信号作出相应的动作。对于学生而言,逻辑图不仅有助于他们理解系统的工作原理,也...

    数字信号处理大作业变声器

    在本项目中,我们主要探讨的是“数字信号处理大作业——变声器”。这是一个典型的数字信号处理(DSP)应用,通常涉及音频信号的捕获、变换、分析以及再合成,以实现声音特征的改变,也就是常说的“变声”效果。在...

    信号完整性分析 大作业

    走线设计是控制信号完整性的关键步骤,需将所有互连线设计为具有相同特性阻抗的传输线,以确保信号质量。选择合适的线宽和线间距,以及考虑制造工艺和成本,能确保PCB设计既经济又满足信号完整性需求。 在仿真过程...

    微控制器作业

    或者学习模糊逻辑控制,以处理不确定和模糊的输入信号;甚至可能要求设计状态机,解决更复杂的状态管理和逻辑切换问题。这些实验不仅锻炼学生解决问题的能力,还要求他们对微控制器进行性能优化,如调整电源管理以...

    控制理论实验在线作业

    【控制理论实验在线作业知识点详解】 1. 闭环系统与开环系统的区别:闭环系统的主要特点是存在反馈机制,能够根据输出结果调整输入,以达到期望的控制效果,而开环系统则没有这种反馈机制。 2. 控制系统分析的三个...

    数字信号处理第一次大作业

    在数字信号处理领域,采样率转换是至关重要的一步,它涉及到信号的频率特性、分辨率以及数据量的控制。本次大作业主要涵盖了两个核心概念:升采样和降采样,以及采样率转换和理想插值。我们将通过Matlab这一强大的...

    matlab控制系统仿真作业题目及答案

    Matlab 控制系统仿真作业题目及答案 Matlab 作业 1:菲波纳奇数列 菲波纳奇数列是一个神奇的数列,从第三个元素开始它的每一个元素等于前两个元素之和,且,任意一个元素与相邻的后一个元素之比逐渐趋近于黄金分割...

    通信信号处理:作业讲解.pdf

    比如,在上述文档中,若中频信号频率为6.5MHz,且采样频率为30MHz,可通过计算得出频率控制字。 关于最大似然估计和最大后验概率估计,这两者是参数估计的两种方法。最大似然估计是通过选择使得观测数据出现概率...

    工程信号处理作业题目

    "工程信号处理作业题目" 一、采样信号处理 采样信号处理是工程信号处理中的一种重要技术,涉及到信号的采样、处理和分析。采样信号处理的目的是将连续信号转换为离散信号,以便于数字信号处理。 1.1 采样信号的 ...

    数字信号处理大作业(谱估计)(北京理工大学刘泉华老师).zip

    《数字信号处理大作业(谱估计)》是北京理工大学2018年度的一份课程大作业,由刘泉华老师指导。这份作业的核心是利用Matlab进行数字信号处理中的谱估计,旨在帮助学生深入理解并实践信号处理的关键技术。下面我们将...

    信号与系统 实验作业

    总的来说,这个实验作业旨在帮助学生通过实践操作,深化对信号与系统理论的理解,掌握MATLAB在信号分析和系统建模中的应用。通过这些实验,不仅能够提升理论知识,也能锻炼实际问题解决能力,为未来在通信、图像处理...

    计算机控制技术小组大作业(2).docx

    计算机控制技术小组大作业 - 空调控制系统设计 计算机控制技术小组大作业中,设计了一种基于 AT89C52 单片机的空调控制系统。该系统主要利用键盘设定温度值,使用热敏电阻和 ADC0809 转换器,进行数据的实时采集,...

    java作业 交通信号.zip

    3. 时间控制:使用定时器或线程睡眠来模拟信号灯的定时切换。 4. 相互协作的对象:`TrafficLight`和`Phase`之间的关系。 5. 测试驱动开发:编写测试用例来验证程序功能的正确性。 6. 命令行界面:基本的用户输入和...

Global site tag (gtag.js) - Google Analytics