2017-02-08 42 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; 
}