Запись в файловый дескриптор - PullRequest
3 голосов
/ 11 мая 2011

В следующем фрагменте я перенаправляю вывод команды ls на ввод wc -l, который работает отлично. Теперь я также хочу перенаправить вывод команды ls в файл с именем "beejoutput.txt" используя следующий код, но он не работает. Нужна помощь.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
  int pfds[2];
  pipe(pfds);
  if (!fork())
  {
    dup2(pfds[1],1);
    close(pfds[0]); 
    execlp("ls", "ls",NULL);
  }
  else
  {
    FILE *outputO=fopen ("beejoutput.txt", "w"); //opening file for writing

    dup2(pfds[0],0);
    dup2(fileno(outputO),pfds[0]); 
    close(pfds[1]); 
    execlp("wc", "wc","-l", NULL);
  }

  return 0;
}

Ответы [ 3 ]

1 голос
/ 11 мая 2011

Это сработало для меня:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

int main(void)
{
    int pfds[2];
    pipe(pfds);

    pid_t childpid = fork();

    if (childpid == 0) {
        /* Child */
        dup2(pfds[1],1);
        close(pfds[0]); 

        execlp("ls", "ls",NULL);

    } else {
        /* Parent */

        pid_t retpid;
        int  child_stat;
        while ((retpid = waitpid(childpid, &child_stat, 0)) != childpid && retpid != (pid_t) -1)
            ;

        close(pfds[1]); 

        char buf[100];
        ssize_t bytesread;

        int fd = open("beejoutput.txt", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
        if (fd == -1) {
            fprintf(stderr, "Opening of beejoutput.txt failed!\n");
            exit(1);
        }

        /* This part writes to beejoutput.txt */
        while ((bytesread = read(pfds[0], buf, 100)) > 0) {
            write(fd, buf, bytesread);
        }

        lseek(fd, (off_t) 0, SEEK_SET);
        dup2(fd, 0);
        execlp("wc", "wc", "-l", NULL);
    }

    return 0;
}
1 голос
/ 11 мая 2011

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

Если вы хотите отправлять одни и те же данные в два разных места назначения, вам нужно порождать обе команды в отдельных процессах и выполнять копирование самостоятельно или порождать копию команды "tee" - в любом случае, вы в конечном итоге с тремя процессами.

0 голосов
/ 11 мая 2011

Попробуйте проверить коды результатов всех системных вызовов, которые вы делаете (включая dup2). Это, возможно, приведет вас к ответу. В любом случае, это хороший навык.

...