Stop/continue一个C程序

Stop/continue a C program

在我的 C 程序中,我想获取进程的 PID,向其发送 SIGSTOP 并等待 SIGCONT 从另一个终端到达。所以,程序看起来像

int pid_t = getpid();
printf("PID %d has been stopped\n", pid_t);
STOP(pid_t);
while (not_received_CONT(pid_t))
   ;
// continue the program

我该如何完成?

你写的没有意义。当您停止该过程时,程序中不再处理指令,因此没有 while 循环等待接收继续。

如果您检查 man 7 signal,您可以看到目前只有一个信号(在 Linux 中)导致进程继续:SIGCONT,因此在技术上不需要处理一段时间循环检查你是否没有得到延续——除非你遇到了一些信号未决的情况,而你正试图确定这一点。

您可以将代码隐式重写为:

int pid = getpid();
printf("PID %d has been stopped\n", pid);
kill(pid, SIGSTOP);
/* Process implicitly continues here, no while needed */

Linux 中有多个向量来管理不一定可移植的信号处理。

有传统的 signal/sigaction 方法来捕获信号并在收到信号时调用函数。如果您不小心,这可能会带来一些意想不到的警告。

您可以管理信号的另一种方法是使用 sigwait,您可以使用 sigprocmask 阻止信号,并且可以使用 sigwait 以安全的方式使用信号来使用信号过程中的一些控制点。

最后,您可以使用 signalfd 执行类似于 sigwait 的操作。它与 sigwait 之间的主要区别是您可以 poll FD 确定其准备就绪(接收到信号)然后 read FD 消耗信号。这使它成为在事件驱动程序中管理信号的一种非常好的方式。