2016-01-31 3 views
2

Так что я пишу простую оболочку в C, которая может перенаправлять STDOUT. Я читаю строку от пользователя, разделяю ее в аргументах, а затем кормлю ее для выполнения в значительной степени. Но когда я перенаправляю вывод, он 1st: создает файл, который я запросил, и заполняет его правильными данными, а затем выводит результаты команды в терминал бесконечно. Я делаю что-то неправильно с dup2?Перенаправление оболочки вызывает бесконечную печать на терминал

Это мой перенаправляющий код. Все используемые переменные являются глобальными, за исключением дескриптора файла.

int execRedirectCommand(){ 
    int fd; 

    pid_t pid = fork(); 


    // fork failed 
    if(pid == -1){ 
     char* error = strerror(errno); 
     printf("fork: %s\n", error); 
     return -1; 
    } 
    //Child process 
    else if(pid == 0){ 
     fd = open(fileName, O_WRONLY | O_CREAT | O_TRUNC, 0755); 
     if(fd == -1){ 
      char* error = strerror(errno); 
      printf("open:%s\n", error); 
      return -1; 
     } 
     dup2(fd, STDOUT_FILENO); 
     close(fd); 

     execvp(payloadArgv[0], payloadArgv); 

     // execvp failed 
     char* error = strerror(errno); 
     printf("pdsh:%s:%s\n", payloadArgv[0], error); 
     return -1; 
    } 
    // Parent process 
    else{ 
     close(fd); 
     fileName = NULL; 

     // Wait for child process to finish 
     int childStatus; 
     waitpid(pid, &childStatus, 0); 
     return 0; 
    } 
} 

EDIT Исправлена ​​опечатка в коде ничего серьезного. EDIT 2 Включая мое главное:

int main(){ 
    setSigHandler(); 
    char* user = getlogin(); 


    while(1){ 
     printf("[%s]-->$", user); 
     getNextCommand(payload); 

     if(!strcmp(payload, "\n")) continue; 

     if(!strcmp(payload, "close")) break; 


     parseCommandString(); 


     if(fileName != NULL){ 
      execRedirectCommand(); 
     }else{ 
      execSimpleCommand(); 
     } 


    } 

    return 0; } 

Примечание: команды без STDOUT Перенаправление работы просто отлично.

+1

Возможно, проблема в том, что холод вызывает эту функцию? Единственное, что я могу заметить, это неправильно, так это то, что вы закрываете 'fd' в процессе обработки, где он никогда не был открыт/инициализирован. – mata

+0

@mata, поскольку я forking не родитель также получить копию файла? EDIT: добавил мой главный. – Akaitenshi

+0

@meta хорошо кажется, что исправил проблему, но мой вопрос остается: не родитель ли получить копию файла тоже? – Akaitenshi

ответ

1

Благодаря mata и nsilent22 для указания этого. Закрытие (fd) в родительском процессе не требуется.

Смежные вопросы