我正在为一个学校项目开发一个用 C 编写的 shell,尽管这个问题没有你想象的那么复杂。问题是,当我键入命令(例如 ls
)时,输出将显示在整个 shell 循环开始处显示的下一个 shell>
提示符之后。 shell 看起来像:
shell>ls
shell>Debug shell.c
我的代码:
int main(){
char line[255];
while (1){
printf("shell>");
fgets(line, 255, stdin);
if (strcmp(line, "exit\n") == 0){
break;
}
else{
char* args[255];
size_t n = 0;
for (char* ptr = strtok(line, " \n"); ptr; ptr = strtok(NULL, " \n")){
if (n >= 255){
break;
}
args[n++] = ptr;
}
args[n++] = NULL;
for (size_t i = 0; i != n; ++i){
//printf("Token %zu is '%s'.\n", i, args[i]);
}
int pid = fork();
if (pid == 0){
//child process code
int flag = execvp(args[0], args);
if (flag < 0){
perror("execvp failed");
}
}
else{
//parent process code
pid_t wait_pid(pid);
}
}
}
return 0;
}
除了所有其他错误之外,是什么导致输出以这种方式显示?
最佳答案
pid_t wait_pid(pid);
是错误的,它没有调用wait_pid
。调用函数时,不指定返回类型。相反,请尝试:
pid_t result_pid = wait_pid(pid);
// add error handling etc here, check man page for return value details
<小时/>
由于您实际上并不等待子进程,因此父进程会立即打印提示,为您提供您看到的输出。
关于c - 下一个 shell 提示符后显示 Unix 命令输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26087637/