从shell execlp执行文件

时间:2012-02-24 10:47:30

标签: c unix process fork

我有一个练习要求我补充代码,以便他的执行结果等同于$ 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 :(得分:0)

棘手的一点是dup2

int dup2(int fildes, int fildes2);

关闭filedes2并将其作为filedes的克隆。这意味着,从现在开始,当您引用filedes2时,就像您提到filedes一样。回到您的代码,您应该知道STDOUT_FILENO1

所以你的代码意味着:

  • 打开文件(描述符filedes
  • 关闭STDOUT_FILENO并将其引用至filedes

答案 1 :(得分:0)

open打开文件并返回文件描述符。 dup2(fildes, fildes2)“将导致文件描述符fildes2引用与文件描述符fildes相同的打开文件描述”,即它关闭标准输出(如果它打开)并使stdout成为新文件描述符的副本。 close然后关闭fd,因为它不再需要,因为stdout现在是您刚刚打开的文件。