问题标签 [sigchld]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
3655 浏览

c - 处理程序的阻塞信号

我为每个信号(SIGCHLD、SIGTSTP、SIGINT)设置了一个处理程序,现在我需要在一些处理程序运行时阻止其他信号。
有一些资源,如sigaction(2)Blocking for Handler,但我不明白在我的情况下应该做什么或如何使用代码。
小信息:
处理程序:sigchldHandler, sigintHandler, sigtstpHander => signals.c
有一个名为smash.c 的文件,其中包含一个无限循环来一直获取命令。
提前致谢

0 投票
2 回答
6588 浏览

c - linux - 父进程的睡眠()被子进程中断

当一个子进程被fork()编辑后,那么父进程就可wait()以为子进程完成。假设,只是为了实验,而不是wait()ing,如果我们制作父进程sleep(),那为什么它不起作用?

我猜SIGCHLD信号导致父进程从sleep(). 但是为什么,它是一个子进程,它们有不同的地址空间和资源,那它怎么能干涉父进程的事情呢?

0 投票
1 回答
457 浏览

c - FreeBSD和C语言完成后获取子进程的PID

我正在尝试正确处理 SIGCHLD,但我无法在处理程序内获取进程的 PID,因此我可以更改结构内一个参数的值。

这是代码:

这是处理程序的代码。在此文件中,有一个名为dead_child_pid的全局变量,我想存储要使用的死孩子的 pid。

当调用 handler_SIGCHLD 并且最后我们设置 mark_unused=1 时,将访问以下代码:

0 投票
1 回答
848 浏览

signals - 由另一个进程发送给父进程的 SIGCHLD

假设我们的进程创建了一个子进程,然后调用wait().

当我尝试发送信号()或做

什么都没有发生。

所以问题是:Linux 中的进程如何确定信号SIGCHLD不是由孩子发送的?或者,也许还有其他机制?

0 投票
1 回答
1255 浏览

linux - 如何在主程序中调用 `wait()` 设置的 `SIGCHLD` 处理程序的插件中安全地`waitpid()`

我正在为需要执行一些子进程并读取它们的输出的工具包编写一个模块。但是,使用该工具包的主程序也可能会产生一些子进程并设置一个信号处理程序,SIGCHLD为其调用wait(NULL)以摆脱僵尸进程。因此,如果我在 mywaitpid()中创建的子进程 exit ,则在调用信号处理程序之前处理子进程,因此wait()信号处理程序中的 in 将等待下一个进程结束(这可能需要永远)。这种行为在waitpid 的手册页中进行了描述(参见被授权者 2),因为 linux 实现似乎不允许该wait()家族处理SIGCHLD. 我已经尝试popen()posix_spawn()他们都有同样的问题。我也尝试过使用 doublefork()以便直接子级立即存在,但我仍然无法收到waitpid()调用后SIGCHLD的 garentee。

我的问题是,如果程序的其他部分设置了一个调用的信号处理程序wait()(也许它应该调用waidpid,但这不是我可以控制的),有没有办法安全地执行子进程而不覆盖SIGCHLD处理程序(因为它可能在某些程序中做某事有用)或任何僵尸进程。

一个显示问题的小程序在这里(请注意,主程序仅在长期子退出后退出,而不是使用waitpid()直接等待的短程序):

0 投票
1 回答
1431 浏览

c - C mini shell,处理 SIGCHLD 的问题

所以我正在实现一个迷你 C shell,它支持后台进程。我的想法是,对于后台模式,父进程不会等待其子进程完成,而是将它们注册到作业列表中,当它们完成时,我捕获 SIGCHLD 信号以清空它们在我的作业列表中的条目。这是代码。

使用这段代码我有两个问题,首先,只有当 BG 命令(比如说“ls &”)是第一个执行的命令时,sigchldHandler 才能工作并清理列表。第二个问题是,对于我的 aptaches 命令(相当于 shell 作业),所有进程的命令名称字符串总是采用最后一个命令值,为什么会这样?这是一个执行示例,以便您了解我在说什么。

还有一个:

0 投票
0 回答
66 浏览

c - 在 C 中为 Unix Style Shell 捕获多个 SIGCHLD 进程

我正在编写一个可扩展的 shell 我正在处理一个与从 Unix 内核捕获 SIGCHLD 信号有关的问题。

我正在尝试维护当前作业的列表(因此当用户在 shell 中键入“作业”时,我可以返回适当的作业)。当我需要从列表中删除作业时,就会出现问题。当我收到 SIGCHLD 信号让我知道进程已终止时,我想将它们从列表中删除。

有两个问题: 1. 当我收到一个 SIGCHLD 信号时,我怎么知道是哪个孩子发出了那个信号?2. 如果收到多个 SIGCHLD 信号并且它们没有排队,所以我只会看到第一个 SIGCHLD 返回,我该如何处理?

谢谢!

0 投票
2 回答
578 浏览

perl - 有没有办法阻止特定的孩子触发 SIGCHLD?

我正在编写一个调试实用程序,并且我想要fork一个孩子,同时防止该孩子的终止触发SIGCHLD其父母。我仍然希望其他孩子通常会SIGCHLD在终止时引起 a。

我想这样做是因为我不想fork触发现有的$SIG{CHLD}处理程序,但我仍然希望其他孩子触发它。也就是说,我想隔离我的新孩子,我不希望它干扰现有孩子的管理。

我对在本地安装自定义$SIG{CHLD}处理程序持谨慎态度,因为我认为我无法正确检测何时应该调用原始处理程序。例如,如果我安装了一个本地处理程序,那么一旦我产生一个孩子并让父母终止它,$SIG{CHLD}我就可以保证收到一个信号。但是,这并不能表明其他孩子是否也终止了,所以我不能确定是否调用原始处理程序。SIGCHLDwaitpidSIGCHLD

我研究了一个进程不能改变它的父pid。我不确定更改孩子的进程组 ID 或会话 ID 是否有用。

甚至有可能阻止特定的孩子触发SIGCHLD父母吗?当它收到它没想到的孩子的信号时,我是否被迫依赖现有的$SIG{CHLD}处理程序来做正确的事情?SIGCHLD

尽管可能有更好的方法来实现该调试实用程序(如果有,请告诉我),但我仍然想知道 POSIX 是否提供对儿童的如此细粒度的控制,并且正在寻找一种 Perl 解决方案来解决我的困境。

0 投票
0 回答
593 浏览

c++ - 学习在 C++ 中 fork() 空闲进程

这是我的编程问题的修订版:

  1. 分叉两个运行随机时间的空闲进程,每个进程运行时间在 0 到 20 秒之间。
  2. 进程应使用信号 SIGSTOP 和 SIGCONT 将进程安排在循环队列中。
  3. 当子进程都为每个空闲进程终止时,父进程也应该终止。
  4. 如果其中一个子进程终止,它应该继续运行,直到它们都使用 SIGCHLD 终止。

这是关于我有多远。

0 投票
1 回答
462 浏览

c - 不想立即删除终止的子进程,需要变成僵尸

我从SE QUE获得了以下信息 将 SIGCHLD 的配置显式设置为 SIG_IGN 会导致任何随后终止的子进程立即从系统中删除,而不是被转换为僵尸。

据我所知,要读取子状态,进程表中需要有子 pid。所以有必要在进程表中有僵尸子进程来读取子状态。

所以我想编写信号处理程序,它将删除“将 SIGCHLD 的处置设置为 SIG_IGN”

我使用下面的代码(在 fork 之前)来避免在终止后立即删除子进程:但我仍然无法获得子进程并且 waitpid 使用 ECHILD 返回 -1。

请提出一些想法,我被这个阻止了。