gpt4 book ai didi

C: fork() - 子级和父级未按预期行事

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

我下面的代码fork()是一个创建其子进程的进程,它们都调用相同的函数,这基本上会有一个循环。在内部,它们会休眠 0 到 5 秒之间的随机秒数,然后打印一条愚蠢的消息,显示哪个 channel 已完成。最后他们打印一条“退出”消息并离开。

问题是,每次子进程打印“退出”消息时,父进程(显然)都会打印相同的消息,即使父进程在完成之前仍需要 1 或 2 个 channel 。当父进程完成时,它将再次打印“退出”消息。如果父进程在子进程之前完成,它将在完成时打印“退出”消息,并在子进程完成时再次打印。

现在,如果我在 Child if 子句中退出或返回,在我的函数之后,则不会打印 Parent “退出”消息。这让我相信 child 正在代表 parent 打印“退出”消息。那么,是什么导致父“退出”消息被打印两次?

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>

const int PASS = 5;
const int RANDLIMIT = 5;
int i = 0;

void doSomeWork(char *who);

int main(int argc, char *argv[])
{
printf("Just started, I am: %d\n", (int) getpid());
pid_t pid = fork();
printf("fork returned: %d\n", (int) pid);
srand((int) pid);

if (pid < 0) {
perror("fork failed");
} else if (pid == 0) {
doSomeWork("Child");
// if I exit(0) or return(0) here, it behaves accordingly.
}
doSomeWork("Parent");
return(0);
}

void doSomeWork(char *who)
{
int control = 0;
for(; i < PASS; i++){
sleep(rand() % RANDLIMIT);
printf("%s: Done pass #%d\n", who, i);
}
printf("%s: exiting...\n", who);
}

child 先完成:

[root@centos ~]# ./fork3
Just started, I am: 18232
fork returned: 18233
fork returned: 0
Child: Done pass #0
Parent: Done pass #0
Child: Done pass #1
Child: Done pass #2
Child: Done pass #3
Parent: Done pass #1
Parent: Done pass #2
Child: Done pass #4
Child: exiting...
Parent: exiting...
Parent: Done pass #3
Parent: Done pass #4
Parent: exiting...

家长先完成:

[root@centos ~]# ./fork3
Just started, I am: 19507
fork returned: 19508
Parent: Done pass #0
Parent: Done pass #1
fork returned: 0
Child: Done pass #0
Parent: Done pass #2
Parent: Done pass #3
Child: Done pass #1
Child: Done pass #2
Child: Done pass #3
Parent: Done pass #4
Parent: exiting...
[root@centos ~]# Child: Done pass #4
Child: exiting...
Parent: exiting...

最佳答案

您在父级和子级调用doSomeWork("Parent")。这就是为什么 exit 让它工作 - 然后子进程在调用 doSomeWork("Parent") 之前终止。

解决方案是:

if (pid < 0) {
perror("fork failed");
} else if (pid == 0) {
doSomeWork("Child");
} else {
doSomeWork("Parent");
}

当然请记住,两个进程同时运行,因此执行顺序是不可预测的(常见的多任务问题)。

关于C: fork() - 子级和父级未按预期行事,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54799879/

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