2012-02-24 80 views
0

我有問我要補充的代碼,讓他執行等同於$ date> out.txt執行文件從外殼execlp

#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); 

回答

0

棘手的位是dup2

int dup2(int fildes, int fildes2); 

它關閉filedes2,並使它的filedes克隆。這意味着,從現在開始,當您提及filedes2時,就好像您提到了filedes。回到你的代碼,你應該知道STDOUT_FILENO1

所以,你的代碼的意思是:

  • 打開一個文件(描述符filedes
  • 關閉STDOUT_FILENO,並使其指filedes
0

open打開文件,並返回一個文件描述符。 dup2(fildes, fildes2)「應使文件描述符fildes2引用與文件描述符fildes相同的開放文件描述」,即它關閉標準輸出(如果它是打開的)並將stdout作爲新文件描述符的副本。 close然後關閉fd,因爲它不再需要,因爲stdout現在是您剛剛打開的文件。