gpt4 book ai didi

c - 使用 fork 和 kill 信号

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

int main() {
int pid = fork();
if(pid > 0){
kill(pid, SIGKILL);
printf("a");
}else{
/* getppid() returns the pid
of the parent process */
kill(getppid(), SIGKILL);
printf("b");
}
}

代码片段的结果可能是:nothing, a, b, ab, ba

我不明白为什么没有,ab 和 ba 是可能的。

int a = 1;
void handler(int sig){
a = 0;
}
void emptyhandler(int sig){
}
int main() {
signal(SIGINT, handler);
signal(SIGCONT, emptyhandler);

int pid = fork();
if(pid == 0){
while(a == 1)
pause();
printf("a");
}else{
kill(pid, SIGCONT);
printf("b");
kill(pid, SIGINT);
printf("c");
}
}

这个结果是 bac, bca。

我不确定为什么“进程不终止”也有效?为什么 SIGINT 会杀死它?

最佳答案

无法确定哪个 child / parent 先运行。或者,如果您有多个内核,它们可能会并行运行,或者操作系统可能会在任何执行点中断它们并运行其他子进程或父进程(或其他一些完全不同的进程)。 kill() 也是异步的,它发送信号,并且可能在 kill() 返回后由接收器稍后处理。

Nothing:父级在 kill(pid, SIGKILL); 之后立即被杀死。 child 在执行 kill(getppid(), SIGKILL);

后立即被杀死

“a”: child 在执行 kill(getppid(), SIGKILL); 之前或之后被杀死。家长可以跑完。

“b”:父级在执行 kill(pid, SIGKILL); 之前或之后被杀死。 child 可以跑完。

"ab" 父进程在打印“a”后立即被杀死(或者它可能在子信号到达之前设法运行完成),子进程在打印“b”(或也许它设法在父信号到达之前运行完成)

"ba" 与 "ab"相同的情况,只是 child 被安排先打印 "b"。

关于c - 使用 fork 和 kill 信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20589017/

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