gpt4 book ai didi

c - SIGQUIT,通过快速、连续的调用处理第二个信号

转载 作者:太空宇宙 更新时间:2023-11-04 11:46:37 25 4
gpt4 key购买 nike

我试图忽略子线程的第一个 SIGQUIT...具体来说,在每次调用后写入控制台并在第二次调用时退出。

我试过这段代码的变体;即每个类似的堆栈溢出线程分成两个函数。不幸的是,对于 child 的处理程序来说,父循环似乎“太快了”。

SIGQUIT 的处理程序:

int goes = 0;

void install_handler(){

write(1, "SIGQUIT\n", 8);

if (goes == 1) exit(0);

goes += 1;
}

只是司机:

{
if((child_pid = fork()) < 0) exit(1);

if (child_pid == 0 ) {

signal(SIGQUIT, install_handler);

while(1){}

} else {

sleep(1);

for (int i = 0; i < 3; i++) {

write(1, "KILLING\n", 8);

kill(child_pid, SIGQUIT);

// sleep(1);


}
}
return 0;
}

我希望输出是~

KILLING
SIGQUIT
KILLING
SIGQUIT
KILLING
...

输出(在父循环中没有休眠)是

KILLING
KILLING
KILLING
SIGQUIT
SIGQUIT

这不是我要达到的顺序。什么是确保在 sigquit 的每个信号上我们都可以保证将“SIGQUIT”写入控制台而不修改 main() 方法的有效方法?

最佳答案

您的问题有一个有趣的答案。但首先,虽然很烦人,但我不允许发表评论,所以我希望我没有犯任何错误。

int goes = 0;
int child_pid = 0;

void install_handler(){
if (child_pid == 0) exit(0); //to exit the program once done
write(1, "SIGQUIT\n", 8);
kill(child_pid, SIGQUIT);
write(1, "KILLING\n", 8);
//you can put it after the if depending on the output
if (goes == 1) {
kill(0, SIGQUIT);
exit(0);
} //this way the program will end himself at the end
// i guess the fact that goes was indented is a mistake
goes += 1;
}

如您所见,我将 kill 放入处理程序中,这样 kill 将不会被发送,直到收到另一个 kill。(注意我在这里是如何调用 pid 的吗?)

{
if((child_pid = fork()) < 0) exit(1);

if (child_pid == 0 ) {



while(1){
signal(SIGQUIT, install_handler);
}

} else {

sleep(1);
kill(child_pid, SIGQUIT);
write(1, "KILLING\n", 8);
for (int i = 0; i < 3; i++) {
signal(SIGQUIT, install_handler);
wait(); //you might even not need the wait!


// sleep(1);


}
}
return 0;

我强烈建议使用 sigaction 而不是 signal,它更精确。我必须说我不确定我的答案,因为我在这台计算机上没有 c 但通常我使用 sigaction 并等待(而不是 sleep )您也不需要将其称为 child_pid,因为它是且不是子 pid,因为它是两个进程

soooo...我希望我有用!

关于c - SIGQUIT,通过快速、连续的调用处理第二个信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57423419/

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