2016-04-29 2 views
0

Я пишу простую программу оболочки в C, и я верю, что у меня все закончилось. Программа должна постоянно печатать «Prompt>» и ждать, пока пользователь либо введет имя исполняемого файла вместе с любыми параметрами, которые потребуются исполняемому файлу. У оболочки есть только одна встроенная функция, quit, которая заканчивает программу. Если пользователь должен был поставить «&» в конце строки, то данный исполняемый файл должен быть запущен в фоновом режиме. (Встроенные функции и команды без «&» должны выполняться на переднем плане и ждать завершения дочернего процесса.) Однако, когда я запускаю свой код и помещаю '&' в конец моей строки, исполняемый файл запускается и заканчивается, но я больше не вижу «подсказки». Я все еще могу ввести имя исполняемого файла или выйти, и он запускается, и все, но я не понимаю, почему приглашение не появляется.Shell Program в 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){