2013-10-30 5 views
0
void execute_command_pipe(char * command_from, char * command_to, char ** args_from, char ** args_to) { 
    pipe(pipefd); 

    int pid = fork(); 
    close(pipefd[0]); 
    if (pid == 0) { 
     //close(STDOUT_FILENO); 
     dup2(pipefd[1], STDOUT_FILENO); 
     int rv1 = execv(get_contain_dir(command_from), args_from); 
     close(pipefd[1]); 
    } else { 
     close(pipefd[1]); 
     dup2(pipefd[0], STDIN_FILENO); 
     int rv2 = execv(get_contain_dir(command_to), args_to); 
     close(pipefd[0]); 
    } 
} 

예를 들어, ls | grep 테스트에서 부모 스레드는 grep을 실행하여 STDIN에서 입력을 수신하고 자식 스레드는 ls의 출력을 STDTOUT에 씁니다.하나의 명령 (execv)을 다른 명령으로 보냄

답변

0

저수준 파이프/포크를 사용해야합니까? 더 쉬운 방법이 없다면 popen/pclose 시스템 호출을 사용하십시오.

예를 들어 ls | grep입니다.

FILE *f = popen("ls"); 
char buf[1000]; 
while(fgets(buf, sizeof(buf), f) 
    call_my_grep(buf); 
pclose(f); 

이것은 쉽고 효율적입니다.

+0

예 파이프와 포크를 사용해야합니다. –

0
void execute_command_pipe(char * command_from, char * command_to, char ** args_from, char ** args_to) { 
    pipe(pipefd); 

    int pid = fork(); 
    if (pid != 0) { 
     dup2(pipefd[0], STDIN_FILENO); 
     close(pipefd[0]); 
     int rv2 = execv(get_contain_dir(command_to), args_to); 
    } else { 
     dup2(pipefd[1], STDOUT_FILENO); 
     close(pipefd[1]); 
     int rv1 = execv(get_contain_dir(command_from), args_from); 
     close(pipefd[0]); 
    } 
}