sách gpt4 ăn đã đi

子进程不通过 fork() 退出

In lại Tác giả: Walker 123 更新时间:2023-11-30 14:41:35 35 4
mua khóa gpt4 giày 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;
trở lại;
}

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");
trở lại;
}
/* 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]);
}khác{
/* 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);
}

câu trả lời hay nhất

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

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

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

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

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

35 4 0
Walker 123
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress