2014-04-12 2 views
0

write(), read() 함수를 사용하여이 프로그램을 코딩 할 수 있다는 것을 알고 싶습니다. argv[] 다음에 fork()으로 2 개의 초기 인수를 취하고 그 하위 프로세스 'stdout이 부모 stdin에게 전달되고 결과가 화면에 표시됩니다.C에서 파이프를 빌드하는 다른 방법이 있습니까?

나는 --->./program date wc

그것은 date | wc 쉘 프로그래밍에서와 같이 같은 결과를 제시해야이 같은 프로그램을 실행할 때.

이 프로그램을 dup()으로 코딩했습니다. 그것은 잘 작동하지만 나는 다른 방법으로 주위에 싶어요. 고맙다. 그리고 나의 영어에 대해 유감스럽게 생각한다. dup2에와

int main(int argc, char* argv[]){ 


char* argument1[]={argv[1], NULL}; 
char* argument2[]={argv[2], NULL}; 
int fd[2]; 
int d; 
pid_t pid; 
char buffer[30]; 

if(argc < 3){ 
printf("No parameter"); 
return 1; 
} 

if(pipe(fd)==-1){ 
perror("pipe failed"); 
exit(1); 
} 

else{ 

    pid=fork(); 

    if(pid==0){ 
    /*child process*/ 
    close(1); 
    dup(fd[1]); 
    close(fd[0]); 

    //close(fd[1]); 

    execvp(argument1[0], argument1); 

    } 

    else if(pid>0){ 
    /*Parent process*/ 
    close(0); 
    dup(fd[0]); 
    close(fd[1]); 

    //close(fd[0]); 

    execvp(argument2[0], argument2); 


    } 

} 


return 0; 

} 
+0

내가 명확하지 않다 확실히 어떤 문제가 있거나 당신이 후입니다. 자식 프로세스 코드에는'close (fd [1]);', 부모 프로세스 코드에는'close (fd [0]);가 있어야한다. 또한 오류를보고하고 각각의'execvp()'다음에 종료해야합니다. 'execvp()'에서 반환 값을 테스트 할 필요는 없습니다. 오류가 있으면 리턴합니다. (close)와 dup() 대신에'dup2()'를 쓰는 것이 일반적으로 더 쉽지만 코드는 좋아 보인다. (더 큰 맥락에서는 문제가 될 수 있지만,() '와 같이 표시됩니다. –

답변

0

같은 코드 : (나는 당신이 당신의 m_exec 기능을 만들어 보자)

int  m_pipe(char *cmd1, char *cmd2) 
{ 
    int fd[2]; 

    if (pipe(fd) == -1) 
    { 
     perror("Pipe failed "); 
     return (-1); 
    } 
    if (fork() == 0) 
    { 
     /*Child process*/ 
     dup2(fd[0], 0); 
     close(fd[1]); 
     m_exec(cmd2); 
    } 
    else 
    { 
     /*Parent process*/ 
     dup2(fd[1], 1); 
     close(fd[0]); 
     m_exec(cmd1); 
    } 
    return (0); 
} 

int main(int argc, char* argv[]) 
{ 
    if(argc != 3) 
    { 
     write(2, "Usage ./a.out cmd1 cmd2\n", strlen("Usage ./a.out cmd1 cmd2\n")); 
     return EXIT_FAILURE; 
    } 
    if (m_pipe(argv[1], argv[2]) == -1) 
    return EXIT_FAILURE; 
    return EXIT_SUCCESS; 
} 
관련 문제