gpt4 book ai didi

c - 忽略 SIGQUIT 一次

转载 作者:行者123 更新时间:2023-11-30 15:06:56 28 4
gpt4 key购买 nike

我正在尝试编写一个函数来在进程上安装信号处理程序,以便在第一次调用该信号时忽略 SIGQUIT 信号,然后在第二个 SIGQUIT 信号时退出。我打算使用计数器的全局变量来计算 SIGQUIT 信号发送的次数。

但是我在执行此操作时遇到问题。我发现 SIG_IGN 会忽略第一个 SIGQUIT 信号,但是我如何检测第一个信号以增加计数器(并且可能更改 signal() 来调用信号处理程序)?

我的代码如下:

// global var counter
int signal_counter = 0;

int main (int argc, const char * argv[]) {

pid_t child_pid = 0;
int child_status = 0;

/* fork a child process... */
child_pid = fork();

if(child_pid < 0 ) { /* fork() and check if there were errors */
perror("fork"); /* print a system-defined error message */
exit(EXIT_FAILURE);
}

else if(child_pid == 0) { /* Child code */
install_handler();
for(; ;sleep(1)); /*loop forever*/
}

else { /* Parent code */
printf("Parent processing starts\n");
printf("\nPARENT: sending first SIGQUIT\n\n");
kill(child_pid,SIGQUIT);
printf("\nPARENT: doing something\n\n");
sleep(3);
printf("\nPARENT: sending SIGQUIT again\n\n");
kill(child_pid,SIGQUIT);
}

return EXIT_SUCCESS;

}

void sigquit() {
printf("SIGQUIT\n");
sleep(2);
exit(0);
}

void install_handler(){
if (signal_counter == 0){
signal(SIGQUIT, sigquit);
signal_counter+=1;
}
else{
signal(SIGQUIT, sigquit);
}
}

如有任何帮助,我们将不胜感激。

最佳答案

解决这个问题的一个方法是使用 posix 标准。据介绍,信号安装一次就是一次。

信号第一次到达时,它将启动指定的方法。因此,如果另一个信号到达,那么它将正常执行(即,它将退出您的应用程序以执行 sigquit)。

关于c - 忽略 SIGQUIT 一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38682518/

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