2014-02-16 4 views
1

Учитывая команду в следующем формате:проблем трубопроводов (Поврежденная труба)

cat < inputfile.txt | tee outputfile.txt 

Я пытаюсь иметь inputfile.txt написать в трубу и затем OutputFile.txt считан из трубы, и я ве написал следующие fucntions сделать так:

void piperead(char** input, int* fd, int start) { 

    dup2(fd[0], 0); 
    close(fd[1]); 
    execl("usr/bin/tee", "usr/bin/tee", input[start + 1], NULL); 

} 

void pipewrite(char** input, int* fd, int start, int end) { 

    dup2(fd[1], 1); 
    close(fd[0]); 
    execl("usr/bin/cat", "usr/bin/tee", input[start + 2], NULL); 

} 

void dopiping(char** input, int start, int end) { 

    int fd[2]; 
    if (pipe(fd) == -1) { 
     cout << "Error: Pipe failed." << endl; 
     exit(1); 
    } 
    int pid = fork(); 
    switch(pid = fork()) {   
     case 0: 
      piperead(input, fd, start, end); 
     default: 
      pipewrite(input, fd, end + 1);   
     case -1: 
      exit(1); 
    } 


} 

Я преобразовал команду в массив c_strings (назовем его cmdarray), а затем я называю dopiping (cmdarray, 0, 3). В момент, когда программа попадает на линию:

dup2(fd[1], 1) 

Программа завершается, потому что программа получила SIGPIPE. Почему моя труба сломана, и как мне это исправить?

+0

Вы уверены, что имеете в виду '' usr/bin/cat'', а не ''/usr/bin/cat? '? –

+0

Кроме того, ваша программа имеет логическую ошибку: она не будет продолжена после успешного вызова 'exec'. Вы забыли «форк»? –

+0

Да, я хотел сделать «/ usr/......». Используется ли fork() во избежание логической ошибки? –

ответ

1

Так глядя на это логически

  • SIGPIPE подается в процесс, который делает запись() к закрытой или трубы/гнездо.
  • Поэтому сторона чтения создаваемой трубы должна быть закрыта.
  • Ваш код не работает fd[0] после того, как вы выполнили свой dup2()
  • Таким образом, похоже, что дочерний процесс завершен.
  • Я бы предположил, что либо execl() не удается - вы должны попробовать указать «/ USR/BIN/тройник» (полный путь не относительный путь)
  • или ваш tee не удается - нужно убедиться, что input[start+1] указывает на строка с нулевым завершением, которая представляет допустимый путь к файлу.
Смежные вопросы