gpt4 book ai didi

c - SIGSTOP 在 c 程序中不起作用

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:05:41 25 4
gpt4 key购买 nike

我正在尝试编写一个 C 程序,其中父进程挂起子进程并在几秒钟后继续执行它。

#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>

void sigstop();
void sigcont();
void sigquit();

int main()
{
int pid;
if ((pid = fork()) < 0) {
perror("fork");
exit(1);
}
if (pid == 0)
{ /* child */
signal(SIGSTOP,sigstop);
signal(SIGCONT,sigcont);
signal(SIGQUIT, sigquit);
for(;;); /* loop for ever */
}
else {
printf("\nPARENT: sending SIGSTOP to suspend the process\n\n");
kill(pid, SIGSTOP);
sleep(5);
printf("\nPARENT: sending SIGCONT to continue the suspended process\n\n");
kill(pid, SIGCONT);
sleep(5);
printf("killing child");
kill(pid,SIGQUIT);
sleep(5);
}
}

void sigstop()
{
printf("CHILD: I've been suspended\n");
}

void sigcont()
{
printf("CHILD: I'm back\n");
}

void sigquit()
{
printf("My DADDY has Killed me!!!\n");
exit(0);
}
sigstop() 中的

printf 永远不会被执行,并且 sigquit()printf("killing child") 之前被调用; 。这是怎么发生的,我怎样才能按正确的顺序获得输出?

最佳答案

如果你read the signal(7) manual page你会看到的

The signals SIGKILL and SIGSTOP cannot be caught, blocked, or ignored.

您根本无法捕捉到该信号。


关于 “Killing child” 以错误的顺序打印的最后一点很容易解决:在您打印的字符串中添加尾随换行符。

这是因为 stdout 的输出(这是 printf 写入的内容)在默认情况下是 line-buffered。这意味着 stdout 的内部缓冲区在换行符上被刷新(即实际写入终端)。如果你没有换行符,那么当进程退出时缓冲区将被刷新,这是在你退出子进程之后。

关于c - SIGSTOP 在 c 程序中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42136946/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com