gpt4 book ai didi

c - 理论、流程 fork()

转载 作者:行者123 更新时间:2023-11-30 20:40:47 25 4
gpt4 key购买 nike

早上好,我想问两件事..1)什么返回 fork() 对已经有 pid==0 的子进程执行的操作?如果我继续fork每个儿子,他们每个人的pid都会是0??或不 ?2)这是我的文件 Buffer.c,它在单个进程上运行。一开始,它 forks() 出一些 Producer 生产者和一些消费者 Consumers ,但我担心每个生产者都会进入下一个 for cicle ,并且它开始为自己生产其他消费者!因为它写 pid=-1 所以...我希望这段代码只产生 P 生产者和 C 消费者,但我需要知道为什么每个生产者不创建其他消费者!你能帮我吗,也许给我一个计划,告诉我将用这段代码创建多少个进程?也许做这样的计划:

父亲: 8 制作人 - - - ... 每个人生产: 5 个消费者等等等等……

int main(int argc, char **argv) {
/....

pid_t pid;
pid_t cons_pid[C];


/* fork producers */
pid = -1;
for(i=0; i<P && pid!=0; i++)
pid=fork();

switch(pid) {
case -1:
...
case 0:
/* GENERIC PRODUCER i */
...
/* PRODUCE() */
printf("Producer %d exits\n",i);
...
return 0;
}

/* fork consumers */
pid = -1;
for (j=0; j<C && pid!=0; j++)
pid = cons_pid[j] = fork();

switch(pid) {
case -1:
....error
case 0:
/* GENERIC CONSUMER j */
CONSUME()....
}
return 0;
}

最佳答案

what returns a fork() did on a child which has already a pid==0

0 不是有效的 PID,因此根据定义,不可能存在 PID=0 的进程,因此 PID=0 是用于指示子状态的完美定义的返回。

if i continue to fork on every son, each of them will have 0 as pid

没有进程的 PID=0。所有 PID 都大于零!零只是新 fork 进程收到的返回值,以表明它是子进程。子进程获得的实际 PID 是使用子进程中的 getpid 函数查询的。然而,父进程无法执行这样的查询,因为在 fork 和假设的查询函数调用之间的时间内,子进程可能已经终止(竞争条件)。因此,您希望 fork 直接将 PID 返回给父级。

顺便说一句:术语是 parent child ,而不是父亲儿子(进程是事物而不是人,尽管 TRON 电影描述的是这样的)。

关于您的代码片段:switch 语句在这里是错误的选择。您想要使用 if 语句。

关于c - 理论、流程 fork(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20374881/

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