2016-04-29 39 views
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); 
    } 
} 

答えて

0

if(!run_background){ 

あなたは

else if(!run_background){ 
"他" を忘れます
関連する問題