다음과 같은 명령을 실행하는 C 프로그램을 작성한다고 가정해 보겠습니다.ls -l | wc -l
시도는 다음과 같습니다.
int main(){
int fd;
char *buffer[] = {"ls", "-l", (char *) NULL};
char *buffer1[] = {"wc", "-l",(char *) NULL};
if(fork() == 0){
// I make the STDOUT_FILENO and fd equivalent
if((fd = dup(STDOUT_FILENO)) == -1){
perror("error");
exit(EXIT_FAILURE);
}
close(fd);
if(fork() == 0)
execvp(buffer[0], buffer);
// then I make fd and STDIN_FILENO equivalent in order to put the output of the previous command
// as the input of the second command
if(dup2(fd, STDIN_FILENO) == -1){
perror("error");
exit(EXIT_FAILURE);
}
execvp(buffer1[0], buffer1);
}
exit(EXIT_SUCCESS);
}
ls -l
하지만 출력을 공급하지 않고 실행됩니다 .wc -l
답변1
두 프로세스 사이에 파이프를 만들어야 합니다. ( |
명령줄에서 사용할 때도 마찬가지입니다.)
이를 수행하는 방법에 대한 많은 예가 있습니다.여기.
기본적으로 호출을 통해 파이프를 생성한 pipe()
다음 각 프로세스가 파이프의 한쪽 끝을 닫습니다.