为什么子进程收到信号后不继续运行?

2024-02-15

以下是我的代码。父进程分叉一个子进程。子进程暂停,直到父进程向它发送信号,然后它继续运行。 我的问题是为什么子进程不继续 追随父母向他发送信号。我错过或误解了什么吗?

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


void 
sigusr1( int pidno )
{
  printf("Catched\n");
}

int 
main()
{
  pid_t pid;

  signal( SIGUSR1, sigusr1 );
  if( (pid = fork()) == 0 ){
    pause();
  printf("Child\n"); 
  }

  kill( pid , SIGUSR1 ); //parent sends signal to child 
  pause();
}

这是父级中发生的情况:

  1. 叉一个孩子。
  2. 向子进程发送 SIGUSR1。
  3. 等待信号。

这是孩子身上发生的情况:

  1. 等待信号。
  2. Print Child.
  3. Call kill(0, SIGUSR1)(0 的值是pid在孩子身上)。呼唤kill进程 ID 为 0 的进程向每个进程发送信号进程组 http://en.wikipedia.org/wiki/Process_group调用的进程的kill.
  4. 等待信号。

您的程序有多种可能的行为,具体取决于父系统调用和子系统调用的执行顺序。根据操作系统的确切版本、各种内核参数的微调、系统的负载情况以及随机的机会,如果多次运行该程序或在一个特定的环境下运行该程序,您可能会或可能不会观察到不同的行为。调试器。

如果父级启动速度比子级快,您可能会看到以下内容:

  1. 父级向子级发送 SIGUSR1。
  2. 子进程收到 SIGUSR1 并打印Catched.
  3. 孩子打电话pause.
  4. 家长来电pause.

按照这个执行顺序,父进程和子进程最终都会永远等待(这是一个deadlock http://en.wikipedia.org/wiki/Deadlock).

如果子进程启动得比父进程快,您可能会看到以下情况:

  1. 孩子打电话pause.
  2. 父级向子级发送 SIGUSR1。
  3. 家长来电pause.
  4. 孩子已解锁并打印Catched.
  5. 儿童版画Child.
  6. 子进程向进程组发送 SIGUSR1。
  7. 儿童版画Catched.
  8. 孩子打电话pause.
  9. 父级已解锁并打印Catched.
  10. 家长退出。

我不认为孩子有办法退出:它调用pause两次,虽然它最多可以接收两个信号,但其中一个是从其自身发送的(来自kill(0,SIGUSR1))并且该值是同步传递的,而不是在执行期间传递pause.

这个程序可能不是您想要编写的,但是由于您没有描述预期的行为,因此不可能说出您想要编写的内容。我确实注意到,您没有遵循分叉程序的通常结构:

pid = fork();
if (pid < 0) {
    /*error handling*/
} else if (pid == 0) {
    /*child code*/
    exit(...); /*Usually, what follows the if is specific to the parent.*/
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么子进程收到信号后不继续运行? 的相关文章

  • 在多线程环境中捕获信号

    我有一个大型程序 需要尽可能具有弹性 并且有大量线程 我需要捕获所有信号SIGBUS SIGSEGV 并在必要时重新初始化有问题的线程 或者禁用该线程以继续减少功能 我的第一个想法是做一个setjump 然后设置信号处理程序 可以记录问题
  • Amazon EC2 的替代工具?

    Amazon 与 EC2 交互的官方工具有点笨重且难以处理 我必须设置一堆环境变量 为 EC2 存储单独的私钥 向我的 PATH 添加额外的项目 等等 它们都输出制表符分隔的行 长度为数百个字符 没有标题 因此解释它们有点困难 他们关于设置
  • 尝试在Python3.6中实现`signal.CTRL_C_EVENT`

    我正在阅读有关信号的内容并尝试实施signal CTRL C EVENT 据我了解 如果用户在程序运行时按 CTRC C 将发送一个信号来终止程序 我可以将程序指定为参数吗 我尝试测试用法 import sys import signal
  • Node 应用程序中的 process.env 未定义

    运行我的 Node 应用程序时node server js process env回报undefined 所以我无法访问任何环境变量 当我尝试将我的应用程序部署到Duostack http www duostack com Calling
  • 是否可以将 Activity 作为新进程启动

    我遇到这种情况 我必须从我的 mainActivity 开始一个活动 但我希望这个新活动作为新进程启动 使用新进程 ID 在android中是否可以实现这一点 任何帮助表示赞赏 就放android process 进程名称 AndroidM
  • pyvenv-3.4 返回非零退出状态 1

    我在 Kubuntu 14 04 我想用 python3 4 创建一个 virtualenv 我之前在其他文件夹中使用过 python2 7 但是当我尝试时 pyvenv 3 4 venv 我有 Error Command home fmr
  • 如何在 alpine 中使用 ps 命令获取特定 PID 的进程名称

    在基于 ubuntu 的 docker os 中 ps PID USER TIME COMMAND 1 postgres 0 00 postgres 47 postgres 0 00 postgres checkpointer proces
  • 获取已创建进程的进程句柄 Windows

    我需要获取运行程序时刚刚创建的所有进程的句柄或 PID 到目前为止 我已经使用了这段代码 每次创建进程时都会告诉我 问题是我只获取有关创建的进程的信息 但没有有关进程本身的任何信息 https msdn microsoft com en u
  • 在Java中执行.lnk文件

    我需要在java中执行 lnk文件 指向exe文件的lnk文件 我能怎么做 在 VB net 中我做 Process Start path 它有效 谢谢你的帮助 Use a 流程构建器 http download oracle com ja
  • 向后台进程发送命令

    我有一个先前运行的进程 process1 sh 它正在后台运行 PID 为 1111 或其他任意数字 我怎样才能发送类似的东西command option1 option2PID 为 1111 的进程 I don t想要启动一个新的proc
  • 如何并行执行4个shell脚本,我不能使用GNU并行?

    我有4个shell脚本dog sh bird sh cow sh和fox sh 每个文件使用 xargs 并行执行 4 个 wget 来派生一个单独的进程 现在我希望这些脚本本身能够并行执行 由于某些我不知道的可移植性原因 我无法使用 GN
  • 类似 jq 中的 sql join

    我有以下 json id 1 type folder title folder 1 id 2 type folder title folder 2 id 3 type item title item 1 folder 1 id 4 type
  • 安装python启动文件

    我如何安装pythonstartup文件 以便它在命令上运行 例如python myfile py 我尝试将其安装到我的 home myuserUbuntu的目录 但它说我没有足够的权限 此外 不同的地方交替说它应该全部大写或全部小写 前面
  • 如何根据标签将单个 XML 文件拆分为多个

    我有一个带有标签的 XML 文件 我想像这样分割文件
  • 使用 xlib 在屏幕顶部绘图

    我想在屏幕上的所有窗口顶部绘制一些图元 我在 C 中找到了一些代码并尝试将其移植以使用 python 的 xlib from Xlib display import Display from Xlib import X from Xlib
  • 终端关闭时 bash 收到的信号

    使用 trap 来捕获信号 如下所示 i 1 while i lt 33 do trap echo i gt gt log txt i done 并强行关闭终端 那么log txt中的内容就是 redhat linux下 1 18 1 17
  • 在VB6中等待进程退出后恢复窗口

    我在win7 64位操作系统中使用VB6 此应用程序是从 xp 迁移的 Me WindowState vbMinimized WaitForProcess Shell launchapp vbNormalFocus Me WindowSta
  • 使用 Runtime.getRuntime().exec() 进行重定向不起作用

    我需要从程序执行命令 命令行是可以的 我在终端试了一下 但是在程序中不行 我从我的代码中添加一个副本 File dir new File videos String children dir list if children null Ei
  • C++,如何在进程或线程之间共享数据

    我有一个运行两个不同操作的程序 我想在它们之间共享变量 目前 我正在使用线程而不是 fork 进程 但即使我将它们声明为易失性 我在共享变量时也遇到问题 我尝试使用 boost 做 boost thread collisions threa
  • 如何使用 UNIX shell 脚本删除平面文件的页眉和页脚记录?

    我有一个平面文件 如下所示 如何使用 UNIX shell 脚本从文件中删除页眉和页脚并重写同一文件 9 20050427 HEADER RECORD 0000000 00000 000000000 123456 00 654321 DAT

随机推荐

  • 在 POST 负载中使用环境变量

    我可以在我发布的有效负载中使用先前测试中设置的环境变量吗 eg POST list some key environment saved value 是的 你可以这么做 你这样发送 some key environment variable
  • Python print 语句在参数之间添加空格

    我正在编写一个非常基本的 hello 程序 但我在名称和第一个感叹号之间不断出现空格 而我在代码中没有看到该空格 我尝试用几种不同的方式重新格式化字符串部分来连接间距 但我无法弄清楚是什么导致了额外的空间 我尝试过单独使用感叹号 或者将其作
  • 在 CUDA 内核中声明变量

    假设您在 CUDA 内核中声明一个新变量 然后在多个线程中使用它 例如 global void kernel float delt float deltb int i blockIdx x blockDim x threadIdx x fl
  • 为数据类型定义自己的 Ord

    我正在尝试制作一些数据结构来解决图形难题 我正在尝试定义边缘的比较标准 但我不确定如何定义 迄今为止 data Edge Edge Set String Bool 如果边缘具有相同的字符串集 并且相等与布尔值没有任何关系 我如何 通知 编译
  • unordered_map 具有三个元素

    我试图在一个元素中包含三个元素unordered map 我尝试了以下代码 include
  • 如何解除对 Java 启动进程的阻止?

    当从命令行执行某些命令 比如说 x 时 我收到以下消息 按任意键继续 因此它会等待用户输入来解锁 但是当我从 java 执行相同的命令 x 时 Process p Runtime getRuntime exec cmd null cmdDi
  • C# 数组的协变和逆变 [重复]

    这个问题在这里已经有答案了 在阅读一本section http en wikipedia org wiki Covariance and contravariance 28computer science 29 Arrays在维基百科上一篇
  • Html IFrame 标签未在电子邮件正文中解释

    我需要在电子邮件正文中发送一个 html 文件 其中包含 iframe 该 html 文件在浏览器中工作正常并播放视频 但是当我在电子邮件正文中发送它时 iframe 标记不会被解释 因此不会表现在身体上 这是 html 文件 b Aman
  • 分配给位置参数[重复]

    这个问题在这里已经有答案了 如何在 Bash 中为位置参数赋值 我想为默认参数分配一个值 if z 4 then 4 3 fi 表明4不是命令 The set内置是设置位置参数的唯一方法 set this is a test echo 1
  • Scylladb:聚类键笛卡尔乘积大小 600 大于最大值 100

    我正在使用 data stax java 驱动程序来查询 scylladb 我在从 scylla 读取数据时看到此错误 RequestHandler ip 9042 回复服务器错误 集群键笛卡尔乘积大小 600 大于最大值 100 连接失效
  • Node.js - 服务器关闭了连接?

    我正在 Node js 服务器上运行一个 Web 应用程序 并且需要它始终在线 因此我将永远使用它 但这是我在一段时间后得到的结果 Error Connection lost The server closed the connection
  • 如何改变ios中源图像的脸部肤色?

    我的代码 如何管理不同肤色的RGB值 以及如何应用 这段代码将改变脸部和头发的颜色 但我想要 1 仅脸部着色 不包括头发 void changeSkinColorValue float value WithImage UIImage nee
  • Angular:将参数传递给另一个组件

    我被 Angular2 困住了 我想从 a 传递参数产品页面 例如 产品 ID 到支付页面 这是我迄今为止尝试过的 付款 html Message message
  • 覆盖对象时的 Perl 内存管理

    我的问题是关于 Perl 如何在内部管理对象的数据 当在 Perl 中创建对象时 新的子例程通常会返回对受祝福的对象的引用 以下面的代码为例 Create a new object my object Object gt new data1
  • 如何找到当前系统时区?

    在 Linux 上 我需要找到当前配置的时区作为 Olson 位置 我希望我的 C 或 C 代码能够移植到尽可能多的 Linux 系统 例如 我住在伦敦 所以我当前的奥尔森位置是 欧洲 伦敦 我是not对 BST EST 等时区 ID 感兴
  • SQL代码转换为C#数据类型问题

    我试图回答这个问题所以问题 https stackoverflow com questions 58726514 sp execution time is extremely slow 给出以下 SQL 代码 DECLARE input1
  • 如何将文本转换为 SVG 路径?

    我在 ttf 文件中有一个字体 想要生成 SVG 并将文本转换为路径 我不需要图像 因此使用 imagettftext 或 Image Magick 字体渲染功能是不够的 我需要可以放大和缩小的形状 我想丢失有关所用字体的信息 并且不想在中
  • Java 8 Stream:如何将当前元素与下一个元素进行比较?

    如何从a中获取下一个元素List使用 Java 8 流 如果我迭代List 我想将当前元素与列表的下一个元素进行比较 使用 Java 8 Stream 可行吗 My free StreamEx https github com amaemb
  • Spark中的分布式缓存相当于什么? [复制]

    这个问题在这里已经有答案了 在Hadoop中 您可以使用分布式缓存来复制每个节点上的只读文件 Spark 中的等效方法是什么 我了解广播变量 但这仅适用于变量 而不适用于文件 看一下 SparkContext addFile 在每个节点上添
  • 为什么子进程收到信号后不继续运行?

    以下是我的代码 父进程分叉一个子进程 子进程暂停 直到父进程向它发送信号 然后它继续运行 我的问题是为什么子进程不继续 追随父母向他发送信号 我错过或误解了什么吗 include