2017-02-08 1 views
0

Essayer de comprendre pourquoi cette section de code en utilisant la commande cat ne fonctionne pas avec execvp en C.Utiliser chat et execvp

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

Lorsque je le lance affiche le contenu de file1.txt mais dit alors:

cat: >> Aucun fichier ou répertoire.

Affiche ensuite le contenu de file2.txt Pourquoi ne reconnaît-il pas l'opérateur >> dans cette instance?

Répondre

0

Vous pouvez lire la commande "man tee" qui est lue depuis l'entrée standard et écrire sur la sortie et les fichiers standard. Vous pourriez réaliser ceci avec l'exemple ci-dessous.

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