2013-05-12 5 views
2

Я пытаюсь передать список строк через канал в дочерний процесс, где он должен отображаться через /bin/cat с использованием execl(). Я работал раньше, но труба не закрывалась, поэтому программа продолжала ждать. Не знаю, что я сделал, и теперь он вообще не работает. Может ли кто-нибудь увидеть мой код и сказать мне, что я делаю неправильно, что данные str не отображаются cat в дочернем процессе?C pipe, fork, dup и exec()

int main(int argc, char** argv) { 

    char *str[] = {"The", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog"}; 
    int fds[TOTAL_CHILDREN]; 
    int writeFds; 
    int catPID; 
    int status; 

    FILE * write_to_child; 

    //create pipe 
    if (pipe(fds) == -1) { 
     perror("creating pipe: failed"); 
     exit(EXIT_FAILURE); 
    } 
    pipe(fds); 
    //create subprocess for cat child 

    switch (catPID) { 
     case 0: // successful creation of child 
      close(fds[1]); //close write side from parents 
      close(0); //close stdin 
      dup(fds[0]); //connect pipe from execl cat to stdin 

      execl("/bin/cat", "cat", (char *) 0); 
      perror("exec failed!"); 
      exit(20); 
      break; 

     case -1: //failure 
      perror("fork failed: cat process"); 
      exit(EXIT_FAILURE); 

     default: //parent process 
      close(fds[0]); 

      writeFds = fds[1]; 
      write_to_child = fdopen(fds[1], "w"); 

      if (write_to_child == NULL) { 
       perror("write to pipe failed"); 
       exit(EXIT_FAILURE); 
      } 
      break; 


    } 

    int i; 
    for (i = 0; i < 9; i++){ 
     fprintf(write_to_child, "%s\n", str[i]); 
    } 

    fclose(write_to_child); 
    close(writeFds); 

    wait(&status); 

    return (EXIT_SUCCESS); 
} 
+0

видеть эту ссылку http://stackoverflow.com/questions/ 9405985/linux-3-0-executing-child-process-with-piped-stdin-stdout – qwr

+1

Если вы зададите вопрос о 'fork()', вы должны, вероятно, называть 'fork()' в программе , – Barmar

+0

Tnanks, это правда! – codeBarer

ответ

1

Вы, вероятно, хотите добавить строку

catPID = fork(); 

, и я не знаю, почему у вас pipe(fds) дважды

+0

вы отлаживаете, как ниндзя! Спасибо. Я не знаю, что делаю, но я удалил вилку и продублировал трубку. Не могли бы вы узнать о каких-либо ресурсах, которые я могу вам рассказать об этих системных вызовах? Теперь, когда вы исправили мою проблему, я хочу прочитать все значения из cat для сортировки. Думаю, я создаю канал от первого ребенка к другому fork() 'd child? – codeBarer

+1

Человек всегда является хорошей командой для поиска системных вызовов, которые приведены в разделе 2. Вы можете сделать еще один канал, но почему бы просто не заменить кошку сортировкой? cat только копирует stdin в stdout. – parkydr

+0

Это то, что я поместил кошку с сортировкой, но после того, как я получил отсортированное значение, мне нужно удалить повторяющиеся слова. – codeBarer

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