gpt4 book ai didi

c - 当有多个 fork 进程在运行时,我无法理解流程

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

我正在运行一个运行多个进程(在本例中为命令)的程序。我坚持运行多个进程,因为它重复并多次运行代码片段。我在尝试了解正在发生的事情时遇到了很多麻烦。

我已经看过许多 youtube 视频和其他关于此的 SO 问题。

下面是我的代码的变体,包括伪代码:

int forking(char **command) {

pid_t parentPID = getpid();
pid_t childPID = fork();

if(childPID < 0) {
printf("Fork failed\n");
} else if(childPID == 0) { //child process
printf("Child PID: %d\n", getpid());
} else {
printf("Parent PID: %d\n",
}

}

int main() {

//open file of commands, each spaced by a newline

printf("Main PID: %d\n", parentPID);
while((getline(&command, &len_buffer, file_pointer)) != -1) {
printf("-----------------\n);
//parse command using strtok() to use execvp()
pid = forking(parsed_command_array);
if(pid == parentPID) {
printf("This is the parent: %d\n", pid);
else {
printf("This is child, pid is: %d\n", pid);
}
}
}

它似乎为 2 个命令打印了以下输出:

------------------------
Main PID: 42729
Parent PID: 42729
This is parent: 42729
------------------------
Main PID: 42729
Child PID: 42730
This is child, pid is: 42730
------------------------
Main PID: 42729
Parent PID: 42729
This is parent: 42729
Child PID: 42731
This is child, pid is: 42731
Parent PID: 42730
This is child, pid is: 42730
Child PID: 42732
This is child, pid is: 42732

对于 while 循环中的每个命令,我希望代码能够:1. 解析 execvp 的命令(我已经完成了)2. 在函数中调用 fork 并返回 PID。如果PID是parent,忽略,如果PID是child,打印PID。

我还想把控制权留在父级,这样当我运行 fork 时,我想抓取子进程的 PID,在子进程中运行进程,然后回到父进程。

我只是不确定我做错了什么,我真的很困惑为什么父进程最初运行,然后在第二个循环中打印出子进程,然后在第三个循环中循环,它打印父级,然后打印命令 3 次。

最佳答案

在第一遍之后的 while 循环结束时,您有两个进程。这两个进程都回到循环的顶部,并且都派生出一个新进程。现在你有 4 个进程,在下一次迭代中它们都会 fork ,现在你有 8 个。

您希望子进程调用 exitexecvp 以便它不会继续循环。

关于c - 当有多个 fork 进程在运行时,我无法理解流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58383415/

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