2016-04-29 15 views
0

Ich schreibe ein einfaches Shell-Programm in C und ich glaube, ich habe es gerade fertig. Das Programm sollte kontinuierlich "Eingabeaufforderung" drucken und darauf warten, dass ein Benutzer entweder den Namen einer ausführbaren Datei zusammen mit allen Parametern, die die ausführbare Datei benötigt, eingibt. Die Shell hat nur eine eingebaute Funktion, quit, die das Programm beendet. Wenn der Benutzer ein '&' am Ende der Zeile setzen sollte, sollte die angegebene ausführbare Datei im Hintergrund ausgeführt werden. (Integrierte Funktionen und Befehle ohne '&' sollten im Vordergrund laufen und darauf warten, dass der Kindprozess beendet wird.) Wenn ich jedoch meinen Code ausführe und am Ende meiner Zeile ein '&' setze, läuft die ausführbare Datei und beendet, aber ich sehe nicht mehr die "prompt>" angezeigt. Ich kann immer noch den Namen einer ausführbaren Datei eingeben oder beenden und es läuft und alles aber ich verstehe nicht, warum die Eingabeaufforderung nicht angezeigt wird.Shell-Programm in C, laufendes Programm im Hintergrund

Auch als eine Nebenfrage. Arbeitet mein Programm korrekt mit untergeordneten Prozessen? Verlasse ich Zombie-Prozesse grundsätzlich nicht mit diesem Code?

#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); 
    } 
} 

Antwort

0

ich denke, wo Sie sagen:

if(!run_background){ 

Sie ein "anderes" vergessen

else if(!run_background){ 
Verwandte Themen