【发布时间】:2018-04-14 19:08:57
【问题描述】:
我正在尝试编写一个 shell 脚本 C语言。简而言之,如果用户输入一个命令,我将其发送到 system() 调用,如果用户输入多个命令,例如“ls;whoami”,我会对其进行解析并创建子进程来执行所有这些命令。现在它可以工作了,但是我的方法(例如gets()和获取用户输入)似乎不太好,当我输入多个命令时,提示文本变得不可见。您有什么建议,或者如果您发现任何错误或错误用法,因为我不是 C 人,那么我将不胜感激。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define RESET "\033[0m"
#define BOLDGREEN "\033[1m\033[32m" /* Bold Green */
#define BOLDMAGENTA "\033[1m\033[35m" /* Bold Magenta */
char input[50];
char command[50];
char *inputget;
char *dotcomma;
char *p;
pid_t pid;
void welcome(){
char* welcomestr = "\n\TEST\n\n";
printf("%s%s%s",BOLDMAGENTA,welcomestr,RESET);
}
void prompt(){
char *username = getenv("USER");
char hostname[1024];
gethostname(hostname, 1024);
char currentDirectory[256];
getcwd(currentDirectory, 256);
printf("%s%s@%s%s%s ~%s $ %s",BOLDGREEN,username,hostname,RESET,BOLDBLUE,currentDirectory,RESET);
}
int main(int argc, char* argv[]){
inputget=input;
welcome();
prompt();
gets(inputget);
if(argc == 1) {
while(strcmp(inputget, "quit")!=0){
p = strsep(&inputget, ";\n");
while(p != NULL){
pid_t parent = getpid();
pid = fork();
if (pid==-1){
perror("failed to fork");
}
else if (pid==0){
system(p);
exit(0);
}else{
p = strsep(&inputget, ";\n");
}
}
wait(NULL);
prompt();
scanf("%s",input);
inputget=input;
}
exit(0);
}else{
//get argc 2 and and read-run commands from text.file
}
}
【问题讨论】:
-
永远不要在 2018 年再次使用
gets,这是一个危险的弃用功能,请改用fgets。 -
提示仍然看不到,因为
prompt中的printf行不以\n结尾,它会刷新标准输出。在prompt中的printf之后添加fflush(stdout);。 -
您必须在
else { p = strsep(&inputget, ";\n"); }块中执行wait(NULL)。做else { wait(NULL); p = strsep(&inputget, ";\n"); } -
@Pablo 是的,就是这样。能否顺便说明一下故障,非常感谢。编辑:当我这样做时,进程不会同时运行,它按顺序运行
-
正如承诺的那样,我已经写了一个答案来更详细地解释这个问题。
标签: c shell input process fork