Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 当有多个fork进程运行时,我很难理解流程_C_Process_Fork_Exec - Fatal编程技术网

C 当有多个fork进程运行时,我很难理解流程

C 当有多个fork进程运行时,我很难理解流程,c,process,fork,exec,C,Process,Fork,Exec,我运行的程序运行多个进程(在本例中是命令)。我被困在运行多个进程中,因为它多次重复和运行代码片段。我很难理解到底发生了什么 我已经看过很多youtube视频和其他关于这个的问题 下面是我的代码的变体,包括伪代码: int forking(char **command) { pid_t parentPID = getpid(); pid_t childPID = fork(); if(childPID < 0) { printf("Fork failed\n"); } else

我运行的程序运行多个进程(在本例中是命令)。我被困在运行多个进程中,因为它多次重复和运行代码片段。我很难理解到底发生了什么

我已经看过很多youtube视频和其他关于这个的问题

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

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);
        }
    }
}
我希望代码能够针对while循环中的每个命令: 1.解析execvp的命令(我已经完成了) 2.在函数中调用fork并返回PID。如果PID是父项,则忽略,如果PID是子项,则打印PID

我还希望将控件保留在父级中,这样当我运行fork时,我希望获取子PID,在子级中运行进程,然后返回到父级


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

循环结束时,而
循环在第一次通过后,您有两个进程。这两个过程都返回到循环的顶部,并且都派生出一个新的过程。现在您有4个进程,在下一次迭代中它们都会分叉,现在您有8个


您希望子进程调用
exit
execvp
,这样它就不会继续循环。

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


您希望子进程调用
exit
execvp
,这样它就不会继续循环。

对不起,我仍然无法理解-在第一个
循环结束时,如果有两个进程,为什么不返回并在
forking()
函数中打印子进程的PID?它似乎打印了父项的PID,然后一直转到第二个循环。@B.M.Corwen在第一个循环中,它打印了父项42729和子项42730。在下一个循环中,它打印父42729的子42731和父42730的子42732(这是第一个子)。哦,好吧,这更有意义,但是为什么
execvp()'会阻止它循环呢?我正在使用
waitpid()`和
WNOHANG
选项,这会有帮助吗?@B.M.Corwen当您调用
execve
时,您将在同一进程中启动一个新程序。如果成功,该函数不会返回。抱歉,我仍然无法理解-在第一个
循环结束时,如果有两个进程,为什么不返回并在
forking()函数中打印子进程的PID?它似乎打印了父项的PID,然后一直转到第二个循环。@B.M.Corwen在第一个循环中,它打印了父项42729和子项42730。在下一个循环中,它打印父42729的子42731和父42730的子42732(这是第一个子)。哦,好吧,这更有意义,但是为什么
execvp()'会阻止它循环呢?我正在使用
waitpid()`和
WNOHANG
选项,这会有帮助吗?@B.M.Corwen当您调用
execve
时,您将在同一进程中启动一个新程序。如果该函数成功,它不会返回。
------------------------
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