Перенаправление stdout в файл после fork () - PullRequest
3 голосов
/ 01 апреля 2011

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

Вот мой код:

int main()
{
    int ls_pid; /* The new process id for ls*/
    char *const ls_params[] = {"/bin/ls", NULL}; /* for ls */
    int file; /* file for writing */

    /* Open file check user permissions */
    if (file = open("outfile", O_WRONLY|O_CREAT) == -1) /* , S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP */
    {
        perror("Failed to open file");
        _exit(EXIT_FAILURE);
    } 

    ls_pid = fork(); /* Create new process for ls */

    if (ls_pid == -1) /* error check */
    {
        perror("Error forking ls (pid == -1)");
        _exit(EXIT_FAILURE);
    }
    else if (ls_pid == 0) /* Child of ls */
    {
        /* Redirect output to file */
        if (dup2(file, STDOUT_FILENO) == -1) /* STDOUT_FILENO = 1 */
        {
            perror("Error duping to file");
            _exit(EXIT_FAILURE);
        }
        close(file);

        execvp("ls", ls_params); /* create the sort process */
        /* execlp("ls", "ls", NULL); */

        /* if this does not end the program, something is wrong */
        perror("Exec failed at sort");
        _exit(EXIT_FAILURE);
    }
    else /* ls parent (1) */
    {
        /* wait for child */
        if (wait(NULL) == -1)
        {
            perror("fork failed on parent");
            _exit(EXIT_FAILURE);
        }
    }

}

1 Ответ

0 голосов
/ 10 марта 2012

Я не вижу никаких проблем.Я попробовал твой код самостоятельно.И это работает!Мой упрощенный код выглядит следующим образом:

int main(void) {
    int fd;

    char* const param[] = {"/bin/ls", NULL};

    fd = open("outfile", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);

    if (fd < 0) {
        perror("open failed\n");
        exit(0);
    }

    pid_t pid = fork();

    if (pid < 0) {
        perror("fork failed\n");
        exit(0);
    }
    else if (pid == 0) {
        dup2(fd, STDOUT_FILENO);

        close(fd);

        execvp("ls", param);
    }
    else {
        wait(NULL);
    }
}

Я скомпилирую его выполнение и найду ожидаемые результаты в outfile.

Единственная разница в том, что я открываю подачу с помощью S_IRUSER |Параметры разрешения S_IWUSER, так как в противном случае открытие завершится неудачно.Я вижу подобные вещи в вашем коде, но как-то вы их прокомментировали ...

...