2016-06-10 2 views
-1

В настоящее время, когда я нахожусь ctrl+d, он продолжает печатать > ERROR снова и снова, пока я не приостановил программу (ctrl+z). Я пробовал различные способы исправить это, но он разрывает программу другими способами.Программа не останавливается на EOF

int main() 
{ 
    char *command;  
    char **parameters; 
    int status;  
    size_t buffsize = 0;  

    while(1) 
    { 
     command = NULL; 
     printf("> "); 

     getline(&command, &buffsize, stdin); 

     command[strlen(command)-1] = '\0'; 

     parameters = tokenize(command); 


     if (!strcmp(command, "exit")) 
     { 
      exit(1); 
     } 

     if (fork() != 0) 
     { 
      waitpid(-1, &status, 0); 
     } 
     else 
     { 
      status = execvp(command, parameters); 
      if (status == -1) 
      { 
       printf("ERROR\n"); 
       exit(1); 
      } 
     } 
     free(command); 
    } 
    return 0; 
} 

EDIT: Вот исправление. Спасибо jil

if(getline(&command, &buffsize, stdin)) == -1) { 
    return 0; 
} 
+4

На каком этапе делает программу проверить EOF? – user3386109

+0

Я попытался добавить 'if (command == EOF) 'или' command == 0)' 'return 0', но он все равно не работает. – noname

+0

Что делает функция tokenize()? Если вызов не изменяет строчную команду, вы передаете полную команду в качестве первого аргумента execvp, где вы должны передавать путь к исполняемому файлу. – odelande

ответ

6

Возможно, вам следует проверить EOF и действовать соответствующим образом. man getline говорит:

возвращает -1 при невозможности чтения строки (в том числе конца-файла состояния)

Так попробовать что-то вроде:

if (getline(&command, &buffsize, stdin) == -1) 
    return 0;