我正在執行兩個 bash 命令ps(這是顯示行程資訊的有效 bash 命令)和abc(無效的 bash 命令)execvp()在創建子行程后使用 byfork()
問題是一旦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\0";
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]={'\0'};
scanf("$[^\n]",&input[0]);
getchar();//to remove \n from stdin
strncpy(out,input,4);
if(strcmp(out,"exit\0")==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;
}
輸出:

uj5u.com熱心網友回復:
問題是,如果execvp失敗,您將回傳main子行程中的函式。這導致原始(父)和子行程都將在回圈中繼續。
如果execvp失敗,您可能應該呼叫exit退出子行程。
另請注意,在父行程中,該ExecCommand函式根本不回傳任何內容。如果您的編譯器沒有抱怨您需要在構建時啟用更多警告。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/457391.html
