0
私はC言語で単純なシェルプログラムを書いています。プログラムは継続的に "Prompt>"を出力し、ユーザが実行可能ファイルの名前と実行可能ファイルのパラメータを入力するのを待ちます。シェルには、プログラムを終了する関数quitが組み込まれています。ユーザーが行の最後に '&'を入れた場合、与えられた実行ファイルはバックグラウンドで実行されます。 (組み込み関数と '&'のないコマンドはフォアグラウンドで実行し、子プロセスが終了するのを待つ必要があります)。しかし、私のコードを実行して私の行の最後に '&'を置くと、私はもはや "プロンプト>"が表示されません。私はまだ実行可能ファイルの名前を入力することも、終了することもできますが、それは実行されますが、なぜプロンプトが表示されないのか分かりません。シェルプログラムC言語で、実行可能なバックグラウンドで実行する
サイド質問としても。私のプログラムは子プロセスを適切に処理していますか?基本的に、私はこのコードでゾンビプロセスを残していませんか?
あなたが言うところ私が思う#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
#include <string.h>
#define MAXBUFF 100
#define MAXLINE 200
int parse_line(char *buffer, char **arg_array);
void evaluate_commandline(char *commandline);
int builtin_command();
int parse_line(char *buffer, char **arg_array){
char *delimiter;
int num_args;
int run_background;
buffer[strlen(buffer)-1] = ' ';
while(*buffer && (*buffer == ' '))
buffer++;
num_args = 0;
while((delimiter = strchr(buffer, ' '))){
arg_array[num_args++] = buffer;
*delimiter = '\0';
buffer = delimiter + 1;
while(*buffer && (*buffer == ' '))
buffer++;
}
arg_array[num_args] = NULL;
if(num_args == 0)
return 1;
if((run_background = (*arg_array[num_args-1] == '&')) != 0)
arg_array[--num_args] = NULL;
return run_background;
}
void evaluate_commandline(char *commandline){
char *arg_array[MAXBUFF];
char buffer[MAXLINE];
int run_background;
pid_t pid;
strcpy(buffer, commandline);
run_background = parse_line(buffer, arg_array);
if(arg_array[0] == NULL)
return;
if(!builtin_command(arg_array)){
if((pid = fork())== 0){
if(execvp(arg_array[0],arg_array)< 0){
printf("%s: Command not found.\n", arg_array[0]);
exit(0);
}
}
if(!run_background){
int child_status;
wait(&child_status);
}
}
return;
}
int builtin_command(char **arg_array){
if(!strcmp(arg_array[0],"quit"))
exit(0);
return 0;
}
int main(){
char commandline[MAXLINE];
while(1){
printf("prompt> ");
fgets(commandline, MAXLINE, stdin);
if(feof(stdin))
exit(0);
evaluate_commandline(commandline);
}
}