【问题标题】:How can I handle SIGSTOP with SIGCONT?如何使用 SIGCONT 处理 SIGSTOP?
【发布时间】:2020-04-11 21:57:44
【问题描述】:

我想要做的是,当我的程序收到 SIGSTOP 时,它应该向自己发送 SIGCONT。如果我在终端上做,它可以工作,但我想在我的程序中做。我尝试了类似的方法,但它不起作用..

你能帮帮我吗?

int main()
{
    pid_t pid;
    pid = fork();

    if(pid > 0)
    {
       int i = 0;

        while(1)
        {
            if(i == 5)
            {
                kill(getpid(), SIGSTOP);
            }
            printf("i = %d\n" ,i);
            i++;
            sleep(1);
        } 
    }

    if(pid == 0)
    {
        while(1)
        {
            kill(getpid(), SIGCONT);
        }
    }
    return 0 ;
}

【问题讨论】:

  • 当您在终端中键入 Control-z 时,它会发送 SIGTSTP,而不是 SIGSTOP
  • “如果我在终端上做”。即使在终端上怎么可能做到这一点?我怀疑您是否真的在这样做,所以请显示您认为可以实现此目的的命令。我认为不可能从终端或以编程方式做你想做的事。来自signal man page:“信号 SIGKILL 和 SIGSTOP 不能被捕获、阻止或忽略”
  • 我运行程序,在我找到终端上的进程ID后, kill -SIGSTOP 5014 ,然后程序停止.. 在我写完 kill -SIGCONT 5014 并继续。
  • 嗯,这不是发送给自己的过程,是吗?另一个进程,shell,正在发送到停止的进程。所以这与您的问题似乎完全不同。
  • 是的,我在问它如何发送给自己。

标签: c signals signal-handling


【解决方案1】:

您混淆了哪个 PID 是哪个。孩子正在向自己发送 SIGCONT,因为它已经在运行,所以它什么也不做。让它改为发送父 SIGCONT。

【讨论】:

  • 成功了,谢谢!当我的程序变得复杂时,我应该在 while 循环中发送 SIGCONT 吗?如果是,我应该如何在我的程序中找到 while 循环?因为如果我使用 while 循环,我不能做任何其他事情。如果我在 while 循环中计算其他内容,则不会经常发送此信号。
  • @Wokers 很可能,您根本不应该在“真实”程序中做您正在做的事情。为什么要让它在停止后立即继续?
  • 因为我的教授希望我们这样做.. SIGSTOP 将到达我的程序,我需要处理。由于无法处理,我发现在它停止的地方继续我的程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 2018-05-09
  • 1970-01-01
  • 2011-05-24
  • 2021-09-09
  • 1970-01-01
相关资源
最近更新 更多