gpt4 book ai didi

子进程不通过 fork() 退出

转载 作者:行者123 更新时间:2023-11-30 14:41:35 27 4
gpt4 key购买 nike

我正在用 C 创建一个简单的 Linux 命令 shell。我无法理解我的代码在哪里出现问题。 “commands”是我希望作为一个父进程的子进程同时执行的 Linux 命令字符串列表。当所有执行完成后,我希望父级退出该函数。但是,当我调用 exit(0) 时,for 循环继续并再次解析当前命令,导致 args 在 execvp 中再次执行。我在这里正确使用 fork() 和 wait() 吗?我也尝试过使用 waitpid() 但没有成功。

void executeShell(char** commands){
char **arr = commands;
char *c;
pid_t pid, wpid;
int status = 0;

for (c = *arr; c; c=*++arr){
// printf("%d-\n", strcmp(command, "exit"));

if (strcmp(c, "exit") == 0){
EXIT = 1;
return;
}

printf("Running command \'%s\'...\n", c);

char** args = parseStringToTokenArray(c, " ");
free(args);

/* fork and execute the command */
pid = fork();
if(pid < 0){
perror("fork() error\n");
return;
}
/* child process executes command */
else if (pid == 0){
/* 'cd' is not a part of /bin library so handle it manually */
if (strcmp(args[0], "cd") == 0){
changeDirectory(args[1]);
}
else if (strcmp(args[0], "sdir") == 0){
searchDirectory(args[1]);
}else{
/* parse commands with arguments */
execvp(args[0], args);//execute the command
}
exit(0);// <-----command is finished, so why no exit?
}
}
/* wait for children to complete */
while((wpid = wait(&status)) > 0);
}

最佳答案

如果execvp成功后,整个子进程地址空间将被 execvp() 调用的程序替换。这意味着 exit(0) 只会在两种特殊情况下被调用,即 cdsdir。就您的代码而言,execvp() 永远不会返回,除非出现错误。

另一个问题是,您在分配args后立即释放它,然后继续在子进程中使用它。这是未定义的行为。

我在您的 wait 代码中发现的唯一问题是,如果任何子级阻塞等待用户输入,则父级将阻塞等待子级退出。

cd 代码对除执行该代码的子进程之外的任何进程都没有影响。父级的当前目录不受影响。正如您在评论中所述,可以通过在父级中处理 cd 来解决此问题,而无需 fork 。

关于子进程不通过 fork() 退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54863660/

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