gpt4 book ai didi

c - 使用提示 : child prints after parent waitpid 实现 shell

转载 作者:太空宇宙 更新时间:2023-11-04 10:14:38 25 4
gpt4 key购买 nike

我目前正在尝试实现一个基本的 shell 程序,它等待用户提示一个命令(就像“ls”或其他命令),下面的代码可以正常工作,除了我得到一个奇怪的输出...

代码

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


char *username;
char hostname[1024];
char currentdir[1024];
char shell_input[256];
int error_code;

int main() {

int pid, status;
char *pos;
username = getenv("USER");
gethostname(hostname, sizeof(hostname));
getcwd(currentdir, sizeof(currentdir));

while(1){
printf("%s@%s:%s$ ", username, hostname, currentdir);
fgets(shell_input, sizeof(shell_input), stdin);

// deleting the newline captured by fgets
if ((pos=strchr(shell_input, '\n')) != NULL)
*pos = '\0';

if((pid = fork())==0){
error_code= execlp(shell_input, shell_input, NULL);
if(error_code!=0){
printf(" %s \n", strerror(errno));
exit(0);
}
}else{
waitpid(pid, &status, -1);
}
}
}

正如预期的那样,当我运行我的程序时,我得到了这个控制台提示:

jeremy@jeremy-pc:/home/jeremy/Cours$ 

然后,如果想在我的程序中运行 ls 命令,该命令有效,但我得到了这个输出:

jeremy@jeremy-pc:/home/jeremy/Cours$ ls
jeremy@jeremy-pc:/home/jeremy/Cours$ example prototype.c dir1 prototype

这里的问题是,“提示”字符串(jeremy@jeremy-pc 等...)打印在 ls 结果之前,而 ls 结果应该在 waitpid 之前打印。

所以我的问题是,只要我没有得到这样的结果,我的代码有什么问题:

jeremy@jeremy-pc:/home/jeremy/Cours$ ls
example prototype.c dir1 prototype
jeremy@jeremy-pc:/home/jeremy/Cours$

预先感谢您的帮助和抽出时间,祝您有美好的一天:)

最佳答案

waitpidoption 参数有问题。通过将 -1 (0xFFFFFFFF) 作为第三个参数,您可能会启用所有选项,包括 WNOHANG,这在联机帮助页中被描述为 return immediately if no child has exited.

禁用所有标志将使 waitpid 等待进程退出:

waitpid(pid, &status, 0);

关于c - 使用提示 : child prints after parent waitpid 实现 shell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46988021/

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