Перенаправить стандартный вывод в файл - PullRequest
0 голосов
/ 31 марта 2019

Я должен изменить этот код. Дочерний процесс должен перенаправить стандартный вывод в текстовый файл.

Я думаю, что я должен сделать что-то с dup2 и exec, но я не знаю что.

Я прочитал это ссылка, а также это .

Но это не помогло мне, вероятно, я делаю что-то не так.

#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main ()
{
    int fds[2];
    pid_t pid;
    /* Create a pipe. File descriptors for the two ends of the pipe are placed in fds. */
    /* TODO add error handling for system calls like pipe, fork, etc. */
    pipe (fds);
    /* Fork a child process. */
    pid = fork ();
    if (pid == (pid_t) 0) {
        /* This is the child process. Close our copy of the write end of the file descriptor. */
        close (fds[1]);
        /* Connect the read end of the pipe to standard input. */
        dup2 (fds[0], STDIN_FILENO);
        /* Replace the child process with the "sort” program. */
        execlp ("sort", "sort", NULL);
    } else {
        /* This is the parent process. */
        FILE* stream;
        /* Close our copy of the read end of the file descriptor. */
        close (fds[0]);
        /* Convert the write file descriptor to a FILE object, and write to it. */
        stream = fdopen (fds[1], "w");
        fprintf (stream, "This is a test.\n");
        fprintf (stream, "Hello, world.\n");
        fprintf (stream, "My dog has fleas.\n");
        fprintf (stream, "This program is great.\n");
        fprintf (stream, "One fish, two fish.\n");
        fflush (stream);
        close (fds[1]);
        /* Wait for the child process to finish. */
        waitpid (pid, NULL, 0);
    }
    return 0;
}

1 Ответ

0 голосов
/ 31 марта 2019

то, что вы сделали с dup2, соединяет stdout родителя с stdin ребенка, оставляя stdout ребенка без перенаправления. поэтому childr будет печатать отсортированные строки в stdout. то, что вы должны сделать дальше, это открыть текстовый файл и сделать dup2 с его stdout. например что-то до execlp

int outfd=open("/tmp/output",O_WRONLY|O_TRUNC|O_CREAT,0600);
dup2(outfd,STDOUT_FILENO);
execlp ("sort", "sort", NULL);

вам также понадобится #include <fcntl.h>, чтобы иметь флаги файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...