Я пишу простую программу оболочки в 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);
}
}