忽略父进程中的信号

2024-06-12

我正在尝试实现一个 shell 程序,我希望 shell 程序忽略 SIG_INT(ctrl + c)。但在我的程序中,子进程也会忽略 SIG_INT 信号,但它不应该这样做,因为 exec 应该将子进程带到另一个程序,并且该程序默认情况下应该处理 SIG_INT 信号。我应该怎么做才能在按下 ctrl + c 时终止子进程。

新编辑:将 signal(certain_signal, SIG_DFL) 放入我的子进程块中后,我的代码工作正常。但我仍然对它是如何工作的感到困惑。这是否意味着信号和信号处理都可以通过执行命令传播?

int main(void){
signal(SIG_INT, SIG_IGN);
int result = fork();
if(result == 0){
    //child:
    //exec some programs
}
else{
    waitpid(result);
    //do something
}

}


I believe you have misunderstood slightly how exec modifies signal dispositions. In the Linux exec man page, for example(1), it states that (my emphasis):

所有进程属性都会在execve(),但以下情况除外:

  • 正在处理的任何信号的处置caught重置为默认值(signal(7)).

被捕获的信号是not与被忽略的信号相同,如signal手册页:

使用这些系统调用,进程可以选择在传递信号时发生以下行为之一:

  • 执行默认操作;
  • ignore信号;或者
  • catch带有信号处理程序的信号,信号处理程序是程序员定义的函数,在传递信号时自动调用。

这实际上是有道理的,因为虽然忽略信号可以通过exec调用,信号处理程序不能 - 用于处理信号的函数已被替换exec调用,因此尝试调用它很可能是灾难性的。

您可以通过编译以下两个程序来看到继承“忽略”配置的这种行为,qqp.c:

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

int main (void) {
    signal (SIGINT, SIG_IGN);
    puts("Parent start");
    if (fork() == 0)
        execl ("./qqc", 0);
    wait(0);
    sleep (1);
    puts("Parent end");
    return 0;
}

and qqc.c:

#include <stdio.h>
#include <unistd.h>
#include <signal.h>

int main (void) {
    //signal (SIGINT, SIG_DFL);
    puts("Child start");
    sleep (60);
    puts("Child end");
    return 0;
}

请注意,您还可以更改第一个代码示例中的配置forkexec。如果您实际上无法控制第二个代码示例将执行的操作(例如,如果您正在调用未编译的可执行文件),那么这将是更好的选择。

Running qqp, neither the parent nor child will exit prematurely no matter how many times you press CTRL-C. But, uncomment out the line that reverts to default behaviour and you can break out of the child easily.

因此,如果您希望您的孩子恢复默认行为,您需要在孩子本身中执行此操作,例如:

signal (SIG_INT, SIG_DFL);

(1) POSIX has a little more detail http://pubs.opengroup.org/onlinepubs/009695399/functions/exec.html on what happens:

信号设置为默认操作(SIG_DFL) 调用过程映像中的操作应设置为新过程映像中的默认操作。除了SIGCHLD,设置为忽略的信号(SIG_IGN)由调用过程映像设置为被新过程映像忽略。设置为由调用过程映像捕获的信号应设置为新过程映像中的默认操作(请参阅<signal.h>)。如果SIGCHLD信号被设置为被调用进程映像忽略,未指定是否SIGCHLD信号被设置为被忽略或设置为新过程映像中的默认操作。


而且,就您的编辑而言,我提出的解决方案有效,但它给您提出了另一个问题:

这是否意味着信号和信号处理都可以通过执行命令传播?

信号本身并不通过exec调用时,信号实际上是正在生成的“中断”。这与信号处理程序(处理信号的代码)或信号处理(信号发生时做什么)不同。如上所示,处置可能会继续存在exec调用但处理程序不能。信号也没有。

What you're seeing when you press CTRL-C and multiple processes are affected has nothing to do with inheriting signals across the exec boundary, it's more to do with the terminal stuff.

A signal delivered to an individual process will not affect any of its child processes. However, pressing CTRL-C does not send a signal to an individual process. The POSIX terminal interface has a concept of controlling terminals and process groups:

每个进程也是进程组的成员。每个终端设备记录一个进程组,称为其前台进程组。进程组控制终端访问和信号传递。终端生成的信号被发送到属于终端前台进程组成员的所有进程。

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

忽略父进程中的信号 的相关文章

  • 在 C# 中创建具有单独列的分隔文本

    我一直在尝试在 C 中创建一个制表符限制的文本文件 以便数据正确显示在单独的列中 Firstname Lastname Age John Smith 17 James Sawyer 31 我尝试过 t 字符 但我得到的只是 Firstnam
  • 如何使用MemoryCache代替Timer来触发一个方法?

    以下方法通过等待已运行操作的结果来处理并发请求 对数据的请求可能会使用相同 不同的凭据同时出现 对于每组唯一的凭据 最多可以有一个GetCurrentInternal呼叫正在进行中 当准备就绪时 该呼叫的结果将返回给所有排队的服务员 pri
  • 如何读取扩展文件属性/文件元数据

    因此 我按照教程使用 ASP net core 将文件 上传 到本地路径 这是代码 public IActionResult About IList
  • 使用Physics.Raycast 和Physics2D.Raycast 检测对象上的点击

    我的场景中有一个空的游戏对象 带有 2D 组件盒碰撞器 我将脚本附加到该游戏对象 void OnMouseDown Debug Log clic 但是当我点击我的游戏对象时 没有任何效果 你有什么想法 如何检测我的盒子碰撞器上的点击 使用光
  • 将内置类型转换为向量

    我的 TcpClient 类接受vector
  • 在新的浏览器进程中打开 URL

    我需要在新的浏览器进程中打开 URL 当浏览器进程退出时我需要收到通知 我当前使用的代码如下 Process browser new Process browser EnableRaisingEvents true browser Star
  • 互斥体实现可以互换(独立于线程实现)

    所有互斥体实现最终都会调用相同的基本系统 硬件调用吗 这意味着它们可以互换吗 具体来说 如果我使用 gnu parallel算法 使用openmp 并且我想让他们称之为线程安全的类我可以使用boost mutex用于锁定 或者我必须编写自己
  • 如何从 .resx 文件条目获取注释

    资源文件中的字符串有名称 值和注释 The ResXResourceReader类让我可以访问名称和值 有办法看评论吗 你应该能够得到Comment via ResXDataNode class http msdn microsoft co
  • 存储来自其他程序的事件

    我想将其他应用程序的事件存储在我自己的应用程序中 事件示例 打开 最小化 Word 或打开文件时 这样的事可能吗 运行程序 http msdn microsoft com en us library ms813609 aspx and 打开
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • 如何将整数转换为 void 指针?

    在 C 中使用线程时 我面临警告 警告 从不同大小的整数转换为指针 代码如下 include
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • 如何在 Blackberry Cascades 中显示具有特定号码的电话板

    我正在使用带有 C QT 和 QML 的 Blackberry Cascades 10 Beta 3 SDK 以及 Blackberry 10 Dev Alpha Simulator 和 QNX Momentics IDE 并且我正在尝试实
  • 如何将自定义 JSON 文件添加到 IConfiguration 中?

    我正在使用 asp net Autofac 我正在尝试加载自定义 JSON 配置文件 并基于该文件创建 实例化 IConfiguration 实例 或者至少将我的文件包含到默认情况下构建的 IConfiguration asp net 中
  • 私有模板函数

    我有一堂课 C h class C private template
  • 如何在按钮单击时模拟按键 - Unity

    我对 Unity 中的脚本编写非常陌生 我正在尝试创建一个按钮 一旦单击它就需要模拟按下 F 键 要拾取一个项目 这是我当前的代码 在编写此代码之前我浏览了所有统一论坛 但找不到任何有效的东西 Code using System Colle
  • 英特尔 Pin 与 C++14

    问题 我有一些关于在 C 14 或其他 C 版本中使用英特尔 Pin 的问题 使用较新版本从较旧的 C 编译代码很少会出现任何问题 但由于 Intel Pin 是操作指令级别的 如果我使用 C 11 或 C 14 编译它 是否会出现任何不良
  • memset 未填充数组

    u32 iterations 5 u32 ecx u32 malloc sizeof u32 iterations memset ecx 0xBAADF00D sizeof u32 iterations printf 8X n ecx 0
  • 使用 GROUP 和 SUM 的 LINQ 查询

    请帮助我了解如何使用带有 GROUP 和 SUM 的 LINQ 进行查询 Query the database IEnumerable
  • 检查Windows控制台中是否按下了键[重复]

    这个问题在这里已经有答案了 可能的重复 C 控制台键盘事件 https stackoverflow com questions 2067893 c console keyboard events 我希望 Windows 控制台程序在按下某个

随机推荐

  • psql:致命:角色“vagrant”不存在[重复]

    这个问题在这里已经有答案了 我创建了一个流浪实例 每次尝试时都会收到此错误psql在终端如何修复它 错误如下 psql 致命 角色 vagrant 不存在 我以为流浪汉会照顾这个 这是我的流浪文件 Vagrant require plugi
  • “unicode”对象没有属性“_meta”

    我正在尝试创建一个视图 用户在其中从下拉菜单中选择一个选项 提交它 然后返回一些数据 具体来说 他们将从数据库中的模型中进行选择 并返回该类的所有实例 我使用 django tables2 输出数据 以便可以排序 但这是我的症结所在 Vie
  • 自定义 NIO 文件系统无法通过 SBT 的测试任务加载

    为了进行测试 我使用内存中的 NIOFileSystem执行 memoryfs https github com openCage memoryfs 我以前已经利用过它 并且它似乎运行良好 例如梅文 然而 现在 在SBT项目中 不可能初始化
  • 如何跨页面播放背景音乐

    我已经读过这个问题 我知道它只能用框架来完成 我真的不想要全站点 AJAX 如何在多个 HTML 页面上播放背景音频 https stackoverflow com questions 4210370 how to play a backg
  • 如何设置 web.config 文件以显示完整的错误消息

    我在 Windows Azure 上部署了 MVC 3 应用程序 但现在当我通过请求时staging url它告诉我 很抱歉 在执行您的要求时发生了一个错误 现在我想查看完整的错误消息 默认情况下由于某些安全原因它会隐藏该消息 我知道我们可
  • VS Code - 如何为工作区选择 Jupyter 内核?

    我有一些 ipynbVS Code 工作区中的文件 它们都位于同一目录中 这是我的工作区配置 vscode settings json python pythonPath usr local anaconda3 bin python 我知道
  • 映射枚举列表

    我有一个名为 UserPermissions 的表 其中通过 userId 与用户表进行 FK 然后是一个用于枚举字符串值的字符串列 我看到的错误是 NHibernate MappingException 表 UserPermissions
  • 带有选项卡和 ActivityGroup 的后退按钮行为

    我有一个活动 Main 显示如下选项卡 private void initTabs mTabHost getTabHost The activity TabHost Intent intent intent new Intent setCl
  • 如何验证 xHTML 中的 noscript+meta 刷新标记?

    对于不支持 JavaScript 的访问者 我将他们重定向到某个页面 js html 为此 我的所有文件中都有以下内容
  • 如何在 Spring Security 中创建自定义身份验证过滤器?

    我正在尝试创建一个自定义 Spring Security 身份验证过滤器以实现自定义身份验证方案 我花了几个小时阅读 Spring Security 但我找到的所有指南都解释了如何配置基本设置 我正在尝试编写自定义设置 但无法找到有关如何执
  • ScrollableControl 在整个控件周围绘制边框

    我正在构建基于的自定义用户控件ScrollableControl 现在我正在尝试在控件周围添加边框 类似于 DataGridView 的边框 我可以使用以下方法绘制边框 e Graphics TranslateTransform AutoS
  • 如何使 R barplot 上的列标签变为斜体

    这可能是一个简单的问题 但是如何仅将条形图上的列标签设为斜体 而不是斜体x axis标签 但列标签是专门的 到目前为止我的代码是 bp barplot means names arg c CON TRI ylim c 0 120 ylab
  • React 和 ES6 继承

    Note 这篇文章是在 React 不支持 ES6 v12 时发布的 我有一个 ES6 课程 class BaseClass getInitialState return message Hello render return div di
  • Plotly:如何制作具有多条线和标准差阴影区域的图形?

    How can I use Plotly to produce a line plot with a shaded standard deviation I am trying to achieve something similar to
  • adb 无法启动守护进程,CreateProcess 失败,错误 2

    我无法运行adb root或任何 adb 命令 我收到以下错误 我设置ADB TRACE 1 C WINDOWS system32 gt adb root system core adb adb c main Handling comman
  • 如何在 rake 任务中强制使用 RAILS_ENV?

    我有这个小耙子任务 namespace db do namespace test do task reset do ENV RAILS ENV test Rake Task db drop invoke Rake Task db creat
  • Windows Phone 8 性能进度条

    我是否需要在 Windows Phone 8 中使用性能进度条 在我的 Windows Phone 7 7 5 应用程序中 我使用了工具包附带的进度条 性能进度条 是否有必要在Windows Phone 8中使用相同的或者简单的进度条就足够
  • SQL - 我需要将总值划分为另一个表中的多行

    假设我在 SQL Server 2008 中有以下表 学校桌 School Id Course Id Total Students 1 Acct101 150 1 Acct102 100 2 Acct101 110 2 Acct102 13
  • 如何有效地测试action是否用属性(AuthorizeAttribute)修饰?

    我正在使用 MVC 并且有一种情况OnActionExecuting 我需要确定即将执行的Action方法是否用属性修饰 AuthorizeAttribute尤其 我不是问授权是否成功 失败 而是问该方法是否需要授权 对于非 MVC 人员
  • 忽略父进程中的信号

    我正在尝试实现一个 shell 程序 我希望 shell 程序忽略 SIG INT ctrl c 但在我的程序中 子进程也会忽略 SIG INT 信号 但它不应该这样做 因为 exec 应该将子进程带到另一个程序 并且该程序默认情况下应该处