2017-02-08 71 views
0

試圖瞭解爲什麼使用cat命令的這部分代碼是不是在C.使用貓和execvp

char *in[5] ={"cat", "file1.txt", ">>", "file2.txt", 0}; 
execvp(in[0], in); 

與execvp工作當我運行它顯示FILE1.TXT的內容,但接着說:

cat:>>沒有這樣的文件或目錄。

然後顯示file2.txt的內容 爲什麼在這種情況下它不能識別>>操作符?

回答

0

您可以閱讀從標準輸入讀取並寫入標準輸出和文件的「man tee」命令。你可以用下面的例子來實現。

#include <sys/types.h> 
#include <sys/wait.h> 
#include <signal.h> 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <errno.h> 

/* 
Implementation of below command: 
cat file1.txt > file2.txt 
*/ 

char *cmd1[] = { "/bin/cat", "file1.txt", 0 }; 
char *cmd2[] = { "tee", "file2.txt", 0 }; 

static void sigchld_hdl (int sig) 
{ 
    int status; 
    while (waitpid(-1, &status, 0) > 0) {  
     if(WIFEXITED(status)) 
      printf("Child exited with code %d\n", WEXITSTATUS(status)); } 
} 

int runcmd(int pfd[]) 
{ 
    int i=0; 

    switch (fork()) { 
     case -1: 
      perror ("fork"); 
      return 1; 
     case 0: 
      dup2(pfd[0], 0); 
      close(pfd[1]); /* the child does not need this end of the pipe */ 
      execvp(cmd2[0], cmd2); 
      perror(cmd2[0]); 
      exit(10); 
     default: /* parent */    
      dup2(pfd[1], 1); 
      close(pfd[0]); /* the parent does not need this end of the pipe */ 
      execvp(cmd1[0], cmd1); 
      perror(cmd1[0]); 

    } 
    sleep(1); 
} 

int main (int argc, char *argv[]) 
{ 
    struct sigaction act; 
    int fd[2]; 

    pipe(fd); 

    memset (&act, 0, sizeof(act)); 
    act.sa_handler = sigchld_hdl; 

    if (sigaction(SIGCHLD, &act, 0)) { 
     perror ("sigaction"); 
     return 1; 
    } 
    runcmd(fd); 

    return 0; 
}