- 浏览: 140298 次
文章分类
最新评论
POSIX.1 认为有以下 6 个与作业控制有关的信号。
* SIGCHLD:子进程已停止或终止。
* SIGCONT:如果进程已停止,则使其继续运行,否则忽略。
* SIGSTOP:停止信号(不能被捕捉或忽略)。
* SIGTSTP:交互式停止信号。
* SIGTTIN:后台进程组成员读控制终端。
* SIGTTOU:后台进程组成员写控制终端。
除 SIGCHLD 以外,大多数应用程序并不处理这些信号,交互式 shell 则通常会处理这些信号的所有工作。当键入挂起字符(通常是 Ctrl+Z)时,SIGTSTP 就被送至前台进程组的所有进程;当通知 shell 在前台或后台恢复运行一个作业时,shell 就向该作业中的所有进程发送 SIGCONT 信号。当对一个停止的进程产生一个 SIGCONT 信号时,该进程就继续,即使该信号是被阻塞或忽略的。
下面这个程序演示了当一个程序处理作业控制时通常所使用的规范代码序列。该程序只是将其标准输入复制到标准输出,而在信号处理程序中以注释形式给出了管理屏幕的程序(如 VI)所执行的典型操作。
这里仅当 SIGTSTP 信号的配置是 SIG_DFL 时才安排捕捉该信号的理由是:init 会将 SIGTSTP、SIGTTIN 和 SIGTTOU 设置为 SIG_IGN,这种配置将被所有登录 shell 继承。所以当此程序由不支持作业控制的 shell(如 /bin/sh)启动时,此信号的配置将被设置为 SIG_IGN。只有作业控制 shell 才应将这 3 个信号重新设置为 SIG_DFL。
程序运行结果如下。
当键入挂起字符时,进程接到 SIGTSTP 信号,然后调用该信号处理程序。此时,应当进行与终端有关的处理(如将光标移到左下角、恢复终端工作方式等)。在将 SIGTSTP 重置为默认值(停止该进程),并解除了对此信号的阻塞(因为正在捕捉一个信号期间系统会自动地阻塞该信号)后,进程向自己发送同一信号 SIGTSTP,使系统停止该进程。仅当该进程接到 SIGCONT 信号后才会如同从 kill 函数返回一样继续运行。最后再将 SIGTSTP 重置为捕捉,并做一些终端处理工作(如重新绘制屏幕)。
* 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 重置为捕捉,并做一些终端处理工作(如重新绘制屏幕)。
发表评论
-
打开伪终端设备
2018-07-09 20:50 1246在伪终端概述一节中已对 PTY进行了初步的介绍。尽管 ... -
伪终端概述
2018-06-02 11:05 1529伪终端就是指,一个应用程序看上去像一个终端,但事实上它 ... -
终端窗口大小和 termcap
2018-05-29 22:39 790多数 UNIX 系统都提供了一种跟踪当前终端窗口大小的 ... -
终端规范模式和非规范模式
2018-05-29 00:25 936终端规范模式很简单:发一个读请求,当一行已经输入后,终 ... -
终端标识
2018-05-23 11:18 565尽管控制终端的名字在多数 UNIX 系统上都是 /de ... -
波特率和行控制函数
2018-05-22 07:53 933虽然大多数终端设 ... -
终端属性和选项标志
2018-05-20 07:40 706tcgetattr 和 tcsetattr ... -
终端特殊输入字符
2018-05-17 06:33 807终端支持下表所示的特殊输入字符。 为了更改 ... -
终端 I/O 综述
2018-05-10 07:56 431终端设备可认为是由内核中的终端驱动程序控制的。每个终端 ... -
POSIX 信号量
2018-05-09 00:03 575在XSI IPC通信之信 ... -
XSI IPC 通信之共享存储
2018-04-25 07:18 942在XSI IPC通信之消息队列和XSI IPC通信之信 ... -
XSI IPC通信之信号量
2018-04-17 23:38 612在XSI IPC通信之消 ... -
XSI IPC通信之消息队列
2018-04-15 10:54 488消息队列是消息的链接表,存储在内核中,由消息队列标识符 ... -
XSI IPC 相似特征介绍
2018-02-08 23:48 477有 3 种称作 XSI IPC ... -
IPC 通信之 FIFO
2018-02-06 22:55 410FIFO 也被称为命名管道,未命名的管道只能在两个相关 ... -
IPC 通信之管道
2018-01-30 22:22 380管道是 UNIX 系统 IPC 的最古老但也是最常用的 ... -
readv/writev 函数及存储映射 I/O
2018-01-19 00:57 875readv 和 writev 函数可用于在一次函数调用 ... -
POSIX 异步 I/O
2018-01-16 21:33 448POSIX 异步 I/O 接口为对不同类型的文件进行异 ... -
fcntl 记录锁
2018-01-06 23:48 571记录锁的功能是:当有进程正在读或修改文件的某个部分时, ... -
守护进程惯例
2018-01-06 23:52 432UNIX 系统中,守护进程遵循下列通用惯例。 ...
相关推荐
《信号与系统大作业——基于MATLAB的常系数线性差分方程解法探讨》 常系数线性差分方程在信号处理与系统分析领域具有核心地位,它能够有效地描述离散时间系统的动态特性。这篇论文旨在深入研究差分方程的多种解法,...
在实际应用中,如数控机床和工业机器人的作业,往往存在许多类同或相似的任务,如果能从历史作业数据中提取出对新任务有用的初次控制信号,就能显著减少学习过程,提升初次迭代的精度。 文献中提到的研究主要集中在...
为了提升高空作业车的作业性能,降低操作人员的劳动强度,并提高作业安全性和精确度,全剑敏等作者设计了一款高空作业车智能控制器。该控制器旨在解决传统高空作业车操作中的问题,传统作业依赖操作人员的视觉反馈,...
在本次"操作系统实验三:实现作业控制语言"中,我们将深入学习并实践操作系统的一些关键概念和技术。 首先,实验的目标是将操作系统分为两个主要部分:引导程序和内核。引导程序是系统启动时执行的第一段代码,它的...
在这个大作业中,你需要利用MATLAB完成以上所有步骤,包括系统建模、能控能观性分析、稳定性评估、状态反馈控制器设计以及SIMULINK仿真。这不仅要求你掌握现代控制理论的基本原理,还需要熟练应用MATLAB工具进行实际...
在机电控制系统中,逻辑图可能描绘了传感器如何将物理量转换为电信号,控制器如何根据这些信号进行决策,以及执行机构如何根据控制信号进行动作。逻辑图是理解系统工作原理和调试系统的重要工具。 总的来说,这个大...
在本项目中,我们主要探讨的是“数字信号处理大作业——变声器”。这是一个典型的数字信号处理(DSP)应用,通常涉及音频信号的捕获、变换、分析以及再合成,以实现声音特征的改变,也就是常说的“变声”效果。在...
走线设计是控制信号完整性的关键步骤,需将所有互连线设计为具有相同特性阻抗的传输线,以确保信号质量。选择合适的线宽和线间距,以及考虑制造工艺和成本,能确保PCB设计既经济又满足信号完整性需求。 在仿真过程...
【控制理论实验在线作业知识点详解】 1. 闭环系统与开环系统的区别:闭环系统的主要特点是存在反馈机制,能够根据输出结果调整输入,以达到期望的控制效果,而开环系统则没有这种反馈机制。 2. 控制系统分析的三个...
在数字信号处理领域,采样率转换是至关重要的一步,它涉及到信号的频率特性、分辨率以及数据量的控制。本次大作业主要涵盖了两个核心概念:升采样和降采样,以及采样率转换和理想插值。我们将通过Matlab这一强大的...
Matlab 控制系统仿真作业题目及答案 Matlab 作业 1:菲波纳奇数列 菲波纳奇数列是一个神奇的数列,从第三个元素开始它的每一个元素等于前两个元素之和,且,任意一个元素与相邻的后一个元素之比逐渐趋近于黄金分割...
比如,在上述文档中,若中频信号频率为6.5MHz,且采样频率为30MHz,可通过计算得出频率控制字。 关于最大似然估计和最大后验概率估计,这两者是参数估计的两种方法。最大似然估计是通过选择使得观测数据出现概率...
"工程信号处理作业题目" 一、采样信号处理 采样信号处理是工程信号处理中的一种重要技术,涉及到信号的采样、处理和分析。采样信号处理的目的是将连续信号转换为离散信号,以便于数字信号处理。 1.1 采样信号的 ...
《数字信号处理大作业(谱估计)》是北京理工大学2018年度的一份课程大作业,由刘泉华老师指导。这份作业的核心是利用Matlab进行数字信号处理中的谱估计,旨在帮助学生深入理解并实践信号处理的关键技术。下面我们将...
总的来说,这个实验作业旨在帮助学生通过实践操作,深化对信号与系统理论的理解,掌握MATLAB在信号分析和系统建模中的应用。通过这些实验,不仅能够提升理论知识,也能锻炼实际问题解决能力,为未来在通信、图像处理...
计算机控制技术小组大作业 - 空调控制系统设计 计算机控制技术小组大作业中,设计了一种基于 AT89C52 单片机的空调控制系统。该系统主要利用键盘设定温度值,使用热敏电阻和 ADC0809 转换器,进行数据的实时采集,...
3. 时间控制:使用定时器或线程睡眠来模拟信号灯的定时切换。 4. 相互协作的对象:`TrafficLight`和`Phase`之间的关系。 5. 测试驱动开发:编写测试用例来验证程序功能的正确性。 6. 命令行界面:基本的用户输入和...
10.20 作业控制信号 241 10.21 其他特征 243 10.21.1 信号名字 243 10.21.2 SVR4信号处理程序的附 加参数 244 10.21.3 4.3+BSD信号处理程序的附 加参数 244 10.22 小结 244 习题 244 第11章 终端I/O 246 ...