fork() 仍然接管父进程后,在子进程中执行 execvp()?

Executing execvp() in Child process after fork() still taking over parent process?

我正在执行两个 bash 命令 ps(显示进程信息的有效 bash 命令)和 abc(无效 bash 命令) 在使用 fork()

创建子进程后在子进程中使用 execvp()

问题是一旦 execvp() 父进程被子进程接管失败,正如我们可以从屏幕截图的输出中看到的那样。

我必须输入两次 exit 才能退出无限 while 循环。发生了什么?我在子进程中正确执行 execvp() 但主(父)进程被子进程接管了吗?

任何人都可以解释这种行为以及我该如何解决这个问题吗?如果 execvp() 失败,我不希望该子进程接管父进程。如何处理?

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


int ExecCommand(char** args)
{
    int childId = fork();
    if(childId<0) printf("Error creating child process\n");

    if(childId==0)
    {
        printf("Executing (%s) whose childId:%d\n", args[0], getpid());
        int status=execvp(args[0],args);
        printf("Failed executing %s with status %d whose childId:%d\n\n",args[0],status,getpid());
        return 1;
    }
    else
    {
        int id=wait(NULL);
        printf("waiting for child: %d\n\n",id);
    }
}

int main()
{

    char out[5]="exit[=10=]";
                
    while(1)
    {
        printf("From Main(): pid:%d ppid:%d\n",getpid(), getppid());

        printf("Enter 'exit' to exit or Just hit Enter to execute below 2 commands:");
        char input[25]={'[=10=]'};
        scanf("%24[^\n]",&input[0]);
        getchar();//to remove \n from stdin

        strncpy(out,input,4);
        if(strcmp(out,"exit[=10=]")==0)
        {
            exit(0);
        }

        char *cmd1[2] = {"ps", NULL}; //valid bash command
        char *cmd2[2] = {"abc", NULL}; //invalid bash command

        char** commands[2]={cmd1, cmd2};
        
        for(int i=0;i<2;i++)
        {
            ExecCommand(commands[i]);
        }
    }
    
    return 0;
}

输出:

问题是,如果 execvp 失败,您 return 到子进程中的 main 函数。这导致原始(父)和子进程都将继续循环。

如果 execvp 失败,您应该调用 exit 退出子进程。


另请注意,在父进程中,ExecCommand 函数根本不会 return 任何东西。如果您的编译器没有抱怨您需要在构建时启用更多警告。