выполнение файлов из оболочки execlp - PullRequest
0 голосов
/ 24 февраля 2012

У меня есть упражнение, в котором меня просят дополнить код, чтобы его выполнение получилось в результате, эквивалентном $ date> out.txt

#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#define NEWFILE (O_WRONLY | O_CREAT)
#define MODE644 (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)

int main() {
    int fd;
    if (fork() == 0) {
        //// Code Here for add/// Result

        fd=open("out.txt",NEWFILE,MODE644);
        dup2(fd,1);
        close(fd);

        execlp("date",NULL);
        exit(0);
     }
     wait(NULL);
 }

Я не могу понять три добавленные строки:

 fd=open("out.txt",NEWFILE,MODE644);
 dup2(fd,1);
 close(fd);

Ответы [ 2 ]

0 голосов
/ 24 февраля 2012

open открывает файл и возвращает дескриптор файла.dup2(fildes, fildes2) "должно заставить файловый дескриптор fildes2 ссылаться на то же самое описание открытого файла, что и для файлового дескриптора fildes", т.е. он закрывает стандартный вывод (если он открыт) и делает stdout копией вашего нового файладескриптор.close затем закрывается fd, так как он больше не нужен, так как теперь stdout - это файл, который вы только что открыли.

0 голосов
/ 24 февраля 2012

Хитрый бит dup2.

int dup2(int fildes, int fildes2);

Он закрывает filedes2 и делает его клоном filedes.Это означает, что теперь, когда вы ссылаетесь на filedes2, вы как бы ссылаетесь на filedes.Возвращаясь к своему коду, вы должны знать, что STDOUT_FILENO равно 1.

Итак, ваш код означает:

  • Открыть файл (дескриптор filedes)
  • Закрыть STDOUT_FILENO и сделать так, чтобы оно ссылалось на filedes
...