- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 posix 进程主题上遇到问题,无法解决。
我有一个进程,它 fork 几个子进程(进程树可能很复杂,不仅仅是一层)。它还会跟踪活跃 child 的 PID。在某个时刻,父进程收到一个信号(比如说 SIGINT)。
在 SIGINT 的信号处理程序中,它会迭代子进程列表并向它们发送相同的信号以防止僵尸进程。现在的问题是
父级和子级具有相同的信号处理程序,因为它是在 fork 之前安装的。这是一个伪代码。
signal_handler( signal )
foreach child in children
kill( child, signal )
waitpid( child, status )
// Releasing system resources, etc.
clean_up()
// Restore signal handlers.
set_signal_handlers_to_default()
// Send back the expected "I exited after XY signal" to the parent by
// executing the default signal handler again.
kill( getpid(), signal )
通过此实现,执行将在 waitpid 上停止。如果我删除 waitpid, children 就会继续运行。
我的猜测是,除非信号处理程序已经结束,否则从它发送的信号不会分派(dispatch)给子级。但如果我省略等待,为什么它们不会被调度?
提前非常感谢!
最佳答案
您所描述的内容应该有效,而且确实如此,通过以下测试用例:
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#define NCHILDREN 3
pid_t child [NCHILDREN];
struct sigaction sa, old;
static void
handler (int ignore)
{
int i;
/* Kill the children. */
for (i = 0; i < NCHILDREN; ++i)
{
if (child [i] > 0)
{
kill (child [i], SIGUSR1);
waitpid (child [i], 0, 0);
}
}
/* Restore the default handler. */
sigaction (SIGUSR1, &old, 0);
/* Kill self. */
kill (getpid (), SIGUSR1);
}
int
main ()
{
int i;
/* Install the signal handler. */
sa.sa_handler = handler;
sigemptyset (&sa.sa_mask);
sa.sa_flags = 0;
sigaction (SIGUSR1, &sa, &old);
/* Spawn the children. */
for (i = 0; i < NCHILDREN; ++i)
{
if ((child [i] = fork ()) == 0)
{
/* Each of the children: clear the array, wait for a signal
and exit. */
while (i >= 0)
child [i--] = -1;
pause ();
return 0;
}
}
/* Wait to be interrupted by a signal. */
pause ();
return 0;
}
如果您看到父进程卡在 waitpid
中,则意味着子进程尚未退出。尝试附加调试器以查看子进程被阻止的位置,或者更简单的是,使用 strace(1)
运行程序。你如何清理你的 pid 数组?确保子进程不会尝试使用 pid 参数 <= 0 调用 waitpid
。确保子进程不会阻塞或忽略信号。
关于process - 从父进程的信号处理程序终止子进程挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7938295/
如果我终止应用程序,我在尝试保持我的功能运行时卡住了。 是否可以在应用程序未运行时保持核心位置(地理围栏/地理定位)和核心蓝牙运行?如果可能如何解决我的问题?我已经检查了背景模式,并实现了核心定位方法
该程序要求用户输入一个数字,然后从列表中返回详细信息。我该怎么做? do { Scanner in = new Scanner(System.in);
我正在开发一个内部分发的 iOS 应用程序(即,没有应用程序商店),我希望能够以恒定的 10 分钟间隔报告设备的位置。 无论如何,我在我的 plist 中包含了 location 作为字段 UIBac
我的 mongodb 服务器突然收到信号 15(终止)。我不知道为什么 mongodb 崩溃了。以下是日志消息。 Mon Jun 27 07:33:31.701 [signalProcessingTh
我按顺序运行了一堆malloc,并且每次都检查以确保它是成功的。像这样: typedef struct { int *aray; char *string; } mystruct; m
这个问题已经有答案了: How to stop a running pthread thread? (4 个回答) 已关闭 8 年前。 可以使用 pthread_join() 停止线程。但让我们想象一
#include #include #include struct node{ char data; int p; struct node *ptr; }; struct node *st
这个问题已经有答案了: Why should I use a semicolon after every function in javascript? (9 个回答) 已关闭 8 年前。 好吧,我问
我有一个启动多个工作线程的函数。每个工作线程都由一个对象封装,该对象的析构函数将尝试加入线程,即调用if (thrd_.joinable()) thrd_.join();。但是,每个 worker 必
我正在实现一个应用程序,当用户摇动手机时,该应用程序会监听并采取行动。 所以我实现了以下服务: public class ShakeMonitorService extends Service {
我在使用 Xcode 时遇到问题,其中弹出错误“Source Kit Service Terminated”,并且所有语法突出显示和代码完成在 Swift 中都消失了。我怎样才能解决这个问题? 这是一
我想为我的控制台应用程序安全退出,该应用程序将使用单声道在 linux 上运行,但我找不到解决方案来检测信号是否发送到它或用户是否按下了 ctrl+c。 在 Windows 上有内核函数 SetCon
关键: pthread_cancel函数发送终止信号pthread_setcancelstate函数设置终止方式pthread_testcancel函数取消线程(另一功能是:设置取消点) 1 线程取消
下面的程序在不同的选项级别下有不同的行为。当我用 -O3 编译它时,它永远不会终止。当我用 -O0 编译它时,它总是很快就会终止。 #include #include void *f(void *
我有 3 个节点的 K8S 集群,我创建了 3 个副本 pod,应用程序 app1 在所有 pod 上运行,我通过运行 service yaml 文件建立了服务,我可以看到通过运行 kubectl g
我打算使用 nginx 来代理 websocket。在执行 nginx reload/HUP 时,我知道 nginx 等待旧的工作进程停止处理所有请求。然而,在 websocket 连接中,这可能不会
在 Ubuntu 9.10 上使用 PVM 3.4.5-12(使用 apt-get 时的 PVM 包) 添加主机后程序终止。 laptop> pvm pvm> add bowtie-slave add
我编写了一个应用程序来从 iPhone 录制视频。它工作正常,但有一个大问题。当 AVCaptureSession 开始运行并且用户尝试从其库(iPod)播放音频时。此操作将使 AVCaptureSe
我将如何使用NSRunningApplication?我有与启动应用程序相反的东西: [[NSWorkspace sharedWorkspace] launchApplication:appName]
我正在使用 NSTask 执行一系列长时间运行的命令,如下所示: commandToRun = @"command 1;command2"; NSArray *arguments = [NSArray
我是一名优秀的程序员,十分优秀!