UNIX环境编程——信号

2023-11-13

本期主题:
信号


往期地址:



1.信号概念

信号是UNIX和Linux系统响应某些条件而产生的一个事件,用来通知进程系统中发生了某种类型的事件。
用术语生成(raise)表示一个信号的产生,使用术语捕获(catch)表示接收到一个信号。
有很多条件都可以产生信号,这里简单列举几种:
在这里插入图片描述
更详细的可看内核代码signal.h中的定义:
在这里插入图片描述

2.信号操作

传送一个信号到目的进程由两个步骤组成:

1.发送信号

内核通过更新目的进程的上下文状态,发送一个信号给目的进程,发送信号可以有以下两个原因:

  • 内核检测到一个系统事件,例如除0错误或者子进程终止
  • 有进程调用了kill函数,显式的要求内核发送信号给目的进程

1.进程组

每个进程都属于一个进程组,进程组是由一个正整数进程组ID来表示的,unix系统提供了大量向进程发送信号的机制,这些机制都基于进程组概念,可用下面的API来返回进程组ID:

#include <unistd.h>
pid_t getpgrp(void);

2. 用/bin/kill 程序发送信号

/bin/kill 可以向另外的进程发送任意信号,例如

linux> /bin/kill -9 15213 
代表发送信号9(SIGKILL)给进程15213

linux> /bin/kill -9 -15213
代表发送信号9给进程组 15213

3.键盘发送信号

unix shell的作业(job)代表对一条命令行求值而创建的过程,任何时刻至多只有一个前台作业和0个或多个后台作业。

linux> ls | sort
利用管道,在shell界面显示的是一个前台作业,ls和sort命令对应着两个后台作业

在键盘上输入 “CTRL+C"会导致内核发送一个SIGINT信号到前台进程组的每个进程中,终止前台作业。
输入"CTRL+Z” 会挂起前台作业

2.接收信号

接收信号就是通过API对接收到的信号进行处理,执行对应的动作

1.函数signal

函数原型:

NAME
       signal - ANSI C signal handling

SYNOPSIS
       #include <signal.h>

       typedef void (*sighandler_t)(int);

       sighandler_t signal(int signum, sighandler_t handler);

例子,自定义两个用户信号,进程在收到用户信号时有对应的打印:

#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>

void sig_usr(int signo)
{
    if (signo == SIGUSR1) //用户定义信号
        printf("receive sigusr1, signo is %d\r\n", signo);
    else if (signo == SIGUSR2)
        printf("receive sigusr2, signo is %d\r\n", signo);
    else
        printf("receive other signo, signo is %d\r\n", signo);
}

int main(void)
{
    if (signal(SIGUSR1, sig_usr) == SIG_ERR)
        printf("can't catch sigusr1\n");
    if (signal(SIGUSR2, sig_usr) == SIG_ERR)
        printf("can't catch sigusr2\n");
    pause();
}

运行后得结果:

jason@ubuntu:~/WorkSpace/0.Unix_AP/10.signal$ ./a.out &
[1] 9298
jason@ubuntu:~/WorkSpace/0.Unix_AP/10.signal$ ps -ef | grep a.out 
jason       9298    7637  0 09:11 pts/2    00:00:00 ./a.out
jason       9302    7637  0 09:11 pts/2    00:00:00 grep --color=auto a.out
jason@ubuntu:~/WorkSpace/0.Unix_AP/10.signal$ kill -USR1 9298
receive sigusr1, signo is 10
[1]+  已完成               ./a.out

这里的 "./a.out &"代表在后台运行,可以简单理解为前台作业就是在shell中看到的。
如果不在后台运行,则需要再开一个终端来做这个实验。

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UNIX环境编程——信号 的相关文章

  • Windows 相当于 Unix find 命令,用于搜索多种文件类型

    虽然在 Windows 中安装了 cygwin 可以提供大部分 unix 命令 但我仍然想知道如何使用 Windows find 命令在一个命令中搜索多个文件类型 ie find name cpp o name h o name java
  • 在 Unix 上,我应该对 errno 使用 system_category 还是 generic_category ?

    C 0x 有两个预定义的error category对象 generic category and system category 据我目前所知 system category 应用于操作系统返回的错误 并且generic category
  • UNIX时间记录时区吗?

    我想问一下UNIX时间 UNIX时间是否记录时区 我将托管从美国芝加哥移至 JST 问题是我的整个 MySQL 数据库都有 UNIX 时间 芝加哥 美国时区 的记录 我有一个 PHP 代码来显示之前的时间 例如 3 天前 昨天等 当我搬到新
  • 通过 Node.js 运行 bash 脚本 - 非法选项 -o pipelinefail

    我正在尝试使用 Node js 执行 bash 脚本child process exec 然而它在文件的第二行爆炸 usr bin env bash set eo pipefail TRACE set x echo we are here
  • 相当于 UNIX diff 和 patch 的本机 PowerShell

    我需要潜在地修补文件作为脚本的一部分 为了使脚本所做的事情更具可读性 我想以类似于 UNIX diff 和 patch 方法的方式来实现它 在标准 UNIX 系统上 diff 可以生成特殊格式的文本文件 表示两个文件之间的差异 这可以与要修
  • grep 查找 Unix 中的特殊字符

    我有一个日志文件 application log 其中可能包含以下多行普通和特殊字符字符串 Q 我想搜索包含这个特殊字符串的行号 grep Q application log 上述命令不返回任何结果 获取行号的正确语法是什么 Tell gr
  • shell脚本中是否有互斥/信号量机制?

    我正在 shell 脚本中寻找互斥 信号量 并发机制 考虑以下情况 除非 a 用户不关闭共享文件 否则 b 用户应该无法打开 更新它 我只是想知道如何在 shell 脚本中实现互斥量 信号量 临界区等 在 shell 脚本中实现锁定机制 文
  • 在 Bash 中拆分 csv 文件中的列

    我想从 csv 文件的第二列中提取值并将提取的值存储在新列中 我的数据集示例 page name post id page id A 86680728811 272953252761568 86680728811 A 86680728811
  • 如何使用 Perl 在 Unix 中获取文件创建时间

    如何使用 perl 在 unix 中获取文件创建时间 我有这个命令显示文件的最后修改时间 perl MPOSIX le print strftime d b Y H M localtime lstat 9 for ARGV file txt
  • 未创建 .ssh 目录

    生成 sshdir 我使用这个命令 ssh keygen 摘自本教程 http ebiquity umbc edu Tutorials Hadoop 05 20 20Setup 20SSHD html http ebiquity umbc
  • Git - 致命:无法获取当前工作目录?

    When I git clone从回购协议中 我得到 fatal Could not get current working directory No such file or directory 我该怎么办 我检查了服务器并发现 git文
  • 如何使用 bash 粘贴来自单独文件的列?

    我想用分隔符 合并不同的列表 第一个列表有 2 个单词 cat first one who 第二个列表有 10000 个单词 cat second languages more simple advanced home expert tes
  • VMA和ELF段之间的关系

    我需要确定 ELF 可执行文件的可加载段的 VMA VMA 可以从以下位置打印 proc pid maps VMA 之间的关系如下所示maps可加载段对我来说也很清楚 每个段由一个或多个 VMA 组成 内核使用什么方法从 ELF 段形成 V
  • 使用 awk 处理多个文件

    我必须使用 awk 处理大量 txt 文件 每个文件 1600 万行 我必须阅读例如十个文件 File 1 en sample 1 200 en n sample 2 10 en sample 3 10 File 2 en sample 1
  • 如何在 ruby​​ Kernel.exec 之后运行代码

    我有以下红宝石外壳 usr bin env ruby stdin each line do line pid fork exec line puts after exec gt Process pid Process wait pid en
  • 如何从 Unix 文件中删除空行

    我需要从输入文件中删除所有空白行并写入输出文件 这是我的数据如下 11216 33 1032747 64310 1 0 0 1 878 0 0 0 1 1 1 087 5 1 1 18 JAN 13 000603221321 11216 3
  • 如何同时正确使用管道和信号?

    我有 2 个孩子 我想将信号从孩子发送到父母 并将答案 随机数 为什么 为什么不 命名管道从父母发送到每个孩子 我有这个代码 include
  • 正则表达式删除块注释也删除 * 选择器

    我正在尝试使用 bash 从 css 文件中删除所有块注释 我有以下 sed 命令的正则表达式 sed r s w s w d 这可以很好地去除块注释 例如 This is a comment this is another comment
  • Perl 和 Unix 如何以相同的顺序对 Unicode 字符串进行排序?

    我正在尝试获取 Perl 和 GNU Linuxsort 1 程序就如何对 Unicode 字符串进行排序达成一致 我在跑sort with LANG en US UTF 8 在Perl程序中我尝试了以下方法 use Unicode Col
  • execv() 和 const 性

    我经常使用execv 函数在 C 中 但如果某些参数在 C 字符串中 则令我烦恼的是我无法执行此操作 const char args 4 args 0 usr bin whatever args 1 filename c str args

随机推荐

  • WEB靶场系类搭建

    环境 windwos centos ubuntu DVWA 1 进 phpmyadmin创建dvwa数据库 2 修改配置文件 3 输入127 0 0 1 dvwa 安装 pikachu 1 直接修改配置文件 2 127 0 0 1 pika
  • js实现瀑布流布局

    实现思路是 收集列表元素数组 每列定宽不定高 列表元素全部相对于容器元素绝对定位 根据容器可视宽度计算每行的元素盛放个数 根据盛放个数先处理第一行 依次排列在第一行 处理后续元素 维护一个每列当前高度的数组 对于后续行的元素 依次往当前最低
  • 每日一库之Go 强大而灵活的电子邮件库:email

    发送邮件是一个很常见的需求 用户邮箱验证 邮箱召回等 Go 语言标准库自带 net smtp 库 实现了 smtp 协议 用于发送邮件 然而这个库比较原始 使用不方便 而且官方声明不再增加新功能 于是乎出现了一些强大的第三方邮件库 今天推荐
  • PSD 格式文件除了 PS ,还能用什么软件打开?

    有人问 除了 Photoshop 还有哪些软件能打开 PSD 格式文件呢 当我看到这个问题时 我立刻理解了他的烦恼 因为有段时间 我的电脑里没有安装 Photoshop 但有一次 我的同事发了一个 PSD 文件给我 我却无法联系到他 我急需
  • linux(centos7) 查看剩余磁盘空间大小

    df hl 查看磁盘剩余空间 df h 查看每个根路径的分区大小 du sh 目录名 返回该目录的大小 du sm 文件夹 返回该文件夹总M数 du h 目录名 查看指定文件夹下的所有文件大小 包含子文件夹 查看硬盘的分区 sudo fdi
  • 非方阵点乘算法

    非方阵点乘算法 基于 lt 算法4 gt 中的P12矩阵相乘 方阵 探索非方阵点乘 线代基础 能够点乘的矩阵 一定满足 前行 后列 算法思考 解决矩阵运算问题 切勿凭空想象 应脚踏实地 举个简单例子写在草稿纸上 并观察 各矩阵下标变化规律
  • git clone 失败或速度慢

    总之就是加代理yyds 具体做法 在github网址前面加上前缀 https ghproxy com 即可 git clone https ghproxy com https github com xxx git
  • Python—爬取小说案例(bs4方法)

    一 源码 import requests from bs4 import BeautifulSoup UA伪装 headers User Agent Mozilla 5 0 Windows NT 10 0 Win64 x64 AppleWe
  • mosquitto安装mysql插件 进行权限认证

    简介 因工作中需要对接物联网设备 设备数据的上传和下发都需要不同的连接账号作为topic 因此采用mqtt mysql的方式 动态的维护mqtt的账号 目录 简介 一 安装依赖 二 下载压缩包 三 安装mosquitto 四 安装mosqu
  • 关于VTK9 vs2019编译QVTK 过程中的记录

    环境 vtk9 0 QT5 12 PCL 1 12 vs2019 x64 这段时间下载了VTK 9 0 并利用vs2019对QVTK进行了编译 1 只要在编译过程中勾选了QT相关选项 就一定可以生成QVTK相关的头文件和库 编译过程网上已经
  • [屏驱相关]【SWDM-QFP100-34SVEA3测评】+LVGL驱屏检测

    这段时间参考华芯微特官方提供的SDK资源包 链接 SWM341资源 百度云盘分享 密码 byv2 验证了部分基础外设的工程示例 此次参考官方提供的LVGL工程示例 先将 基于LVGL纯净版 目录下的 SWM341 lvgl8 3 3 221
  • uni-app开发5+app,图片无法在真机上面显示。

    uni app开发5 app 图片无法在真机上面显示 总结 标签使用错误 请不要使用img标签 img
  • 备用内存 释放_如何释放为硬件保留的内存(内详!!!)

    分割线 网友 240034315yue 补充的几点 以下的操作可能有风险 请酌情考虑 如果找我上面说的那么做还不行的话大家可以看看 注明一 1 如果单通道的话 内存条为一根 通电情况下直接拔掉 在装上 然后开机 在按照楼主说的msconfi
  • 双因素方差分析_科研常用显著性分析方法汇总及选择(T检验,Mann-Whitney U test检验,方差分析等)...

    科研常见的差异性分析方法汇总 根据数据是否符合正态分布 分为 参数检验 非参数检验 非参数检验是在总体方差未知或知道甚少的情况下 利用样本数据对总体分布形态等进行推断的方法 由于非参数检验方法在推断过程中不涉及有关总体分布的参数 因而得名为
  • ubuntu查看搜索可安装包名

    比如要安装openjdk 但是不知道安装包名 可用有以下方法搜索 用aptitude search openjdk
  • 快速学完OpenCV+python计算机视觉图像处理(四)

    返回主目录 4 图像基本特效 4 1 图像特效介绍 图像特效分为以下几个 分别是 灰度处理 底板效果 马赛克 毛玻璃效果 图像融合 图片蓝色 边缘检测 浮雕效果 4 2 图像灰度处理1 灰度处理常用方法 方法1 直接使用imread里面的参
  • 性能篇之对象拷贝工具BeanUtils.copyProperties和BeanCopier.copy的比较

    对象的拷贝在开发过程中肯定非常常见 想必大家使用spring中的BeanUtils copyProperties来完成的 小编最初也是用习惯了这个工具 但是在一次codereview中 大佬给我提出建议使用cglib的BeanCopier
  • 欧几里得距离,曼哈顿距离,切比雪夫距离

    1 欧几里得距离 欧式距离 它是在m维空间中两个点之间的真实距离 在二维和三维空间中的欧氏距离的就是两点之间的距离 简单来说就是两点之间直线最短的那段距离 相关联的范数称为欧几里得范数 也称 L 2 L 2 L2 范数 二维空间的公式 三维
  • 【密码学】常见密码算法分类和运用

    一 摘要算法 Digest Algorithm 摘要算法 是指把任意长度的输入消息数据转化为固定长度的输出数据的一种密码算法 又称为 散列函数 哈希函数 杂凑函数 单向函数 等 通常用来做数据完整性的判定 即对数据进行哈希计算然后比较 摘要
  • UNIX环境编程——信号

    本期主题 信号 往期地址 UNIX环境编程 文件IO UNIX环境编程 标准IO UNIX环境编程 进程环境与进程控制 unix高级环境编程 线程详解 unix环境高级编程 UNIX体系架构 文章目录 1 信号概念 2 信号操作 1 发送信