【问题标题】:How to send signal to a child process created via fork and execl?如何向通过 fork 和 execl 创建的子进程发送信号?
【发布时间】:2018-04-06 21:15:37
【问题描述】:

假设我有一个程序foo,它只是永久打印但在此之前停止,

int main(int argc, char * argv[])
{
    kill(getpid(), SIGSTOP);
    while(1) {
        printf("foo\n");
    }
    return 0;
}

然后我有一个程序bar,它分叉并运行foo

int main(int argc, char * argv[])
{
    pid_t pid = fork();
    if (pid == 0)
    {
        execl("foo", "foo", NULL);
    }
    return 0;
}

现在,我希望 bar 能够向 foo 发送 SIGCONT,以便它可以继续其打印任务,然后再次发送 SIGSTOP,甚至稍后再次发送 SIGCONT,等等。

我不知道该怎么做。有什么帮助吗?

编辑:我发现了我的问题。显然,foo 程序在运行时还没有准备好立即接受信号。当我这样做时

sleep(5);
int rc = kill(pid, SIGCONT);

成功了。

【问题讨论】:

  • edit您的问题是 (1) 显示您尝试过的内容,(2) 准确解释您尝试时发生的情况,以及 (3) 删除编辑。然后(4)发布一个解释解决方案的答案。附:情况可能不是“foo 程序在运行时还没有准备好立即接受信号”;可能是您在 foo 进程自行停止之前发送了 SIGCONT 信号。向正在运行(即未停止)的进程发送继续信号是无操作(即未排队)。您可以通过在 foo.c 的开头添加 sleep(6) 来通过实验验证这一点。
  • 哦。你可能是对的。
  • 当 PID > 0 时,它在父进程中运行,因此可以向特定的 'pid' 发送信号

标签: process c signals exec fork


【解决方案1】:
pid_t pid = fork();
if (pid == 0)
{
    execl("foo", "foo", NULL);
}
int rc = kill(pid, 18);
return 0;

【讨论】:

  • 这应该让foo 继续打印吗? foo 只是为我而挂
  • −1 用于将符号常量替换为文字常量 — 特别是因为 SIGCONT 不是 one of the ones whose value is universal(请参阅 signal(7))。
  • @G-Man 我对此也不满意,但我对 C 不熟悉,没有可用的头文件,不确定必须如何完成 (CONT / @我查看的 987654327@) 和 man 2 kill 不包含可以说明的示例。
【解决方案2】:

建议:不要忘记处理来自系统调用的错误代码!不处理错误代码的工作是更糟糕的风格!这两个动作可以在一个程序中完成。在这种情况下,它会更有效:

#include <errno.h>

int main(int argc, char * argv[])
{
    int rc = 0;

    pid_t pid = fork();
    if (pid == 0) /* child */
    {
        kill(getpid(), SIGSTOP);
        if (rc == -1) {
                  perror("Something wrong while kill() in child");
        }
        while (1) {
                  printf("foo\n");
        }
    } else if (pid > 0) { /* father */
        rc = kill(pid, SIGCONT);
        if (rc == -1) {
                  perror("Something wrong while kill() in parent");
        }
    } else if (pid < 0) {
        perror("Something wrong while fork()");

        return -1;
    }

    return 0;
}

【讨论】:

  • 如果您想展示一个良好编码风格的示例,为什么要使用文字常量而不是符号常量 SIGCONT  —  尤其是在 its value is not universal 时(参见 signal(7))?跨度>
  • @G-Man 我知道。我替换它。我刚刚从上一个答案中复制粘贴此块并忘记替换它。
猜你喜欢
  • 1970-01-01
  • 2019-06-02
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多