2017-09-24 1 views
0

쉘을 생성해야하는 과제가 있습니다. 대부분의 명령을 자체 프로세스에서 실행해야합니다. 그러나 모든 하위 프로세스간에 파이핑을 구현해야 할 때 어려움이 발생합니다.파이프를 하위 프로세스에 연결하기

내가 지금까지 이해 한 바에 따르면 상위 프로세스에 모든 파이프를 작성한 다음 STDIN/STDOUT으로 파이프를 복제해야한다는 것입니다. |

쉘 $> 고양이 file.txt를 :

int count = 2 * amountOfCommands 
int fd[count]; 
for (int i = 0; i < count; i++) { 
    pipe(fd); //I have error checking, but I left it out here. 
} 

우리가이 예를 들어 파이프를 만들 거하는 가정 해 봅시다 : 그래서 이런 식으로 각 명령에 대한 새 파이프를 생성하는 기능을했다 grep 'pattern1'| grep 'pattern2'| 화장실 -l

이것은 우리가 4 개 파이프를 만드는, 그래서 8 것 계산된다는 것을 의미하지만 그것은 다음과 같이 결국 않습니다, 복사 부분에 확실 해요 : 여기

내가 가정 0 나는 파이프의 나머지 부분과 어떻게해야, 2 STDERR

cat file.txt 
0: STDIN 
1: fd[1] //WRITE 

grep 'pattern1' 
0: fd[0] //READ from cat 
1: fd[3] //WRITE 

grep 'pattern2' 
0: fd[2] //READ from grep 
1: fd[5] //WRITE 

wc -l 
0: fd[4] //READ from grep 
1: STDOUT 

예라면이며, 1 STDOUT_FILNO입니다 STDIN_FILENO입니까? 4를 만들었으므로 4 개의 읽기와 4 개의 쓰기가 있어야합니다. 그러나 그들을 함께 연결하면 2 개의 파이프 만 필요합니까? 나는 어딘가 잘못된 생각을하고 있니?

+0

당신은 체인 4 개 명령에 3 개 파이프가 필요합니다. – eckes

+0

위에 게시 한 예를 상세히 설명해 주시겠습니까? @eckes – Cows42

+0

당신의 예제는 fd [3] double을 사용합니다. fd [0] - fd [5]를 사용하면 6 개의 fds와 3 개의 파이프가 있습니다. 명령에서 사용하는 것과 동일한 3 개의 파이프 기호. – eckes

답변

0

당신은 n 명령에 대한 n-1 파이프가 필요합니다 감사합니다. 파이프를 만들 반복 할 때 각 호출에 새로운 두 요소 int 배열 (오프셋)을주고 있는지 확인해야합니다

int pipes = numOfCommands - 1; 
int fd[pipes][2]; 
for (int i=0;i<pipes;i++) 
    pipe(fd[i]); 
+0

아, 감사합니다! – Cows42

관련 문제