2014-11-10 1 views
1

저는 운영 체제 클래스의 프로그래밍 할당 작업을하고 있으며 출력이 터미널에 나타나는 방식과 관련하여 몇 가지 문제가 있습니다.파이프를 사용하는 C 프로그래밍이 비정상적으로 표준 출력으로 표시됩니다.

프로그램의 목적은 파일이나 STDIN으로부터 입력을 받아 들여 본질적으로 4 개의 파이프를 통과시켜 단어의 빈도를 얻는 것입니다. 저는 fork(), execlp() 및 pipe()를 호출하여 프로그램을 완료하는데 어려움을 겪지 않지만, 마지막 자식이 실행되어 터미널에 다음과 같이 인쇄 될 때까지 :

os-class ~/cs344/Homework3 190% myword text.txt 
os-class ~/cs344/Homework3 191%  1 aaaaa   
1 aaaaaa  
    1 aaaaaaa 
     8 it 
     5 s 
     5 sa 

는 (저는 여기에 191 %를 'LS'같은 것을 명령을 입력 할 수 있습니다 ..)

myword 내 실행하고 text.txt 내가 테스트를 위해 사용하고 파일입니다. 내 파이프가 STDIN 및 STDOUT으로 올바르게 정렬되어 있기 때문에 주로 혼란 스럽습니다. 어딘가에 wait()을 삽입해야합니까?

어떤 제안을 해주셔서 감사 드리며 이미 어딘가에 대한 답변이 있으면 죄송합니다. 나는 무엇을 검색해야하는지 정확히 알지 못했다.

+0

예. 아마도'wait()'(또는 아마도 여러 회선의 wait() 호출을 사용해야 할 것입니다.) 아마 myword가 종료되기 전에 모든 출력이 나타나는지 확인해야합니다. –

답변

0

fork()을 수행하는 각 학부모는 자녀가 wait()이어야하며 그렇지 않은 경우 부모가 퇴장 한 후에도 계속 실행됩니다.

셸 (작성한 경우)도 시작하는 프로그램을 기다려야합니다.

+0

내 지식은 모두 리눅스 프로그래밍 인터페이스에서 나온다. wait() 호출은 모두 wait (NULL)이다 ... 나의 경우에는 NULL을 childs 리턴 상태로 대체해야 하는가? –

+0

@TonyTyrrell : 자식의 종료 상태를 알고 싶다면, 그렇습니다.'int corpse; int 상태; 어떤 프로세스가 죽었는지 (시체)와 종료 상태를 얻는 'corpse = wait (& status);' 백그라운드에서 실행중인 프로세스가 있다면 다른 프로세스가 죽을 것으로 예상 될 때 죽을 수 있으므로 일반적으로 루프에서 wait()하거나 waitpid() 또는 둘 다를 사용해야합니다. –