2014-03-03 2 views
2

Я создаю простую оболочку в c с помощью fork и execlp. Мне будет предоставлен набор команд, разделенных трубами. например: ls -l | wc-1. Я пытаюсь реализовать простую программу оболочки с использованием c. По какой-то странной причине, я получаю ошибку обрыва трубы.Причина сломанной трубы в c

void excueteCommand(commandNode* head, int input) { 

    int pfds[2] = { -1, -1 }; 

    if (head->next != NULL) { 

     pipe(pfds); 
    } 

    if (fork() == 0) { /* child */ 

     if (input != -1) { 

      dup2(input, 0); 
      close(input); 
     } 

     if (pfds[1] != -1) { 

      dup2(pfds[1], 1); 
      close(pfds[1]); 
     } 

     if (pfds[0] != -1) { 

      close(pfds[0]); 
     } 

     execlp(head->command, head->args, NULL); 
     exit(1); 
    } 

    else { /* parent */ 

     if (input != -1) { 
      close(input); 
     } 

     if (pfds[1] != -1) { 
      close(pfds[1]); 
     } 

     if (head->next != NULL) { 

      thePipenizer(head->next, pfds[0]); 
     } 
    } 
} 
+0

убедитесь, что процесс на самом деле forking '(result = fork()) == -1' – motoku

+0

Forking работает, потому что я жду статуса и есть два процесса, но я не получаю никакого вывода ... – jrdnsingh89

ответ

0

Привет, я не знаю, какой именно индекс. Я сделал простую прогу, чтобы показать вам какую-то ошибку, которую вы делаете.

int main() 
{ 
    int pfds[2] = { -1, -1 }; 
    int input; 
    char *argvv = ""; 
    char *tab = malloc(500); 
    int i; 
    int nbRead; 
    int stat; 

    input = dup(0); 
    if (pipe(pfds) == -1) 
    exit(-1); 
    if (fork() == 0) 
    { /* child */ 
     dup2(pfds[1], 1); 
     close(pfds[0]); 
     execlp("ls", argvv, NULL); 
     exit(-1); 
    } 
    else 
    { /* parent */ 
     close(pfds[1]); 
     wait(&stat); 
     do 
     { 
      nbRead = read(pfds[0], tab, 500); 
      for (i = 0; i < nbRead; i++) 
      printf("%c", tab[i]); 
     } while (nbRead > 0); 
     close(pfds[0]); 
    } 
    return (0); 
} 

Во-первых: Вместо того, чтобы в отношении PFDs [0] и PFDs [1] значение, посмотрите на возвращаемое значение функции трубы. Функция pipe return -1 в случае ошибки (см. Man pipe).

Второе: не забудьте закрыть все открытые fd, это важно для системы.

Если вы рассказали нам больше о

вход

может быть, мы нашли вашу проблему.

0

В родительском объекте попробуйте сбросить pfds. То есть:

if(pfds[1] != -1) { 
    close(pfds[1]); 
    pfds[1] = -1; /* Add this line */ 
} 

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

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