gpt4 book ai didi

c - Wait() 运行两次?

转载 作者:太空宇宙 更新时间:2023-11-04 08:20:35 26 4
gpt4 key购买 nike

在我下面的代码中,我正在运行一个父进程,该进程 fork 为两个子进程。在 child(getpid()); 之后,两个 child 都以状态退出。

但是,当我运行父进程时,它总是以某种方式决定运行父部分两次(设置两个不同的 pid 值),而我无法让它只运行一次。有没有办法在获取一个值后让等待停止?

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>

void child(int n) { //n: child pid
printf("\nPID of child: %i \n", n);

//random number rand
int randFile = open("/dev/random", O_RDONLY);
int r;

if(rand < 0)
printf("ERROR: %s\n", strerror(errno));
else {
unsigned int seed;
read(randFile, &seed, 4); //&rand is a pointer, 4 bytes
int randClose = close(randFile);

srand(seed); //seeds rand() with random from /dev/random
r = rand();

if(randClose < 0)
printf("ERROR: %s\n", strerror(errno));

//range between 5 and 20 seconds
r = r % 20;
if( r < 5)
r = 5;
}
// printf("\n%i\n", r);
sleep(r);
// sleep(1);
printf("\n child with pid %i FINISHED\n", n);

exit( r );
}

int main() {
printf("\nPREFORK\n");

int parentPID = getpid();

int child0 = fork();
if(child0 < 0)
printf("ERROR: %s\n", strerror(errno));

int child1 = fork();
if(child1 < 0)
printf("\nERROR: %s\n", strerror(errno));

if(getpid() == parentPID)
printf("\nPOSTFORK\n");

//if children
if(child1 == 0) //using child1 as child-testing value b/c when child1 is set, both children are already forked
child(getpid());

int status;
int pid = wait(&status);

//parent
if(getpid() != 0) {
if( pid < 0)
printf("\nERROR: %s\n", strerror(errno));
if ( pid > 0 && pid != parentPID) {
printf("\nPID of FINISHED CHILD: %i\n Asleep for %i seconds\n", pid, WEXITSTATUS(status));
printf("PARENT ENDED. PROGRAM TERMINATING");
}
}
return 0;
}

最佳答案

parent 正在做:

int child0 = fork();  // + test if fork failed
int child1 = fork(); // + test if fork failed

首先你只有 parent 。在第一个 fork 之后,您有父代和第一个子代,它们都在相同的执行点,所以就在下一个 fork 之前。所以在那之后, parent 重新创建了一个 child ,第一个 child 创建了自己的 child (并且会像 parent 一样)。

你必须使用 if/else 来确保 child 不会 fork 。即:

child0 = fork();  // add check for errors
if (child0 == 0) {
// the 1st child just have to call that
child(getpid());
exit(0);
}
// here we are the parent
child1 = fork();
if (child1 == 0) {
// the 2nd child just have to call that
child(getpid());
exit(0);
}

当然你可以做不同的,这只是一个例子。要点是不要在子进程中调用 fork()

关于c - Wait() 运行两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33624711/

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