gpt4 book ai didi

C++ 进程 fork 和 sigalarm

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:00:12 26 4
gpt4 key购买 nike

这个程序的目标是 fork 并让子进程 sleep ,而父进程无限循环等待中断。当我点击 ^C 时,它会调用 void parent 函数。然而,这部分有效,来自 kill ( pid, SIGALRM ) 的消息无效。我检查了一下,pid 是 child 的正确进程 ID。

我已经搜索了一段时间,但我还没有发现我做错了什么。我在从子进程到父进程之前使用了 kill ( pid, SIGALRM ) 但我不明白为什么这不起作用..

#include <signal.h>
#include <unistd.h>
#include <iostream>
#include <sys/types.h>
#include <sys/wait.h>

using namespace std;

int pid;

void parent ( int sig )
{
kill ( pid, SIGALRM );
cout << "I'm a parent " << getpid() << " My child is " << pid << endl;
}

void child ( int sig )
{
cout << "I am " << getpid() << "my parent is " << getppid()<< endl;
cout << "Use ctrl+backslash to actually end the program" << endl;
}
int main()
{
pid = fork();
if(pid == 0)
{ //Child process
cout << "Child pid = " << getpid() << " Waiting for interrupt." << endl;
(void) signal ( SIGALRM, child );
pause();
}
else if(pid > 0)
{ //Parent
sleep(2);
cout << "child pid = " << pid << endl;
struct sigaction act;
act.sa_handler = parent;
sigemptyset ( &act.sa_mask);
sigaction (SIGINT, &act, 0);
while(1)
{
sleep ( 1 );
}
}
return 0;
}

最佳答案

好的,所以我想出了问题。
当我按 ^C 时,它会在主进程中捕获中断,但会杀死子进程。当我从程序内部运行 system("ps") 时,它显示子 a.out 进程已失效。为了解决这个问题,我在 child 的进程中添加了以下内容:

struct sigaction act;
act.sa_handler = CHILD_PRESERVER;
sigemptyset ( &act.sa_mask);
sigaction (SIGINT, &act, 0);

其中 CHILD PRESERVER 是一个虚拟函数,除了保持它的存活之外什么都不做。

没有看出这个解决方案很优雅,所以如果有人有更正确的方法,请发布。

关于C++ 进程 fork 和 sigalarm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9289234/

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