2011-11-15 6 views
3

다음 코드는 파이프를 통해 다른 프로세스의 메시지를 읽습니다. 모든 프로세스는 모든 메시지를 올바르게 출력하지만 while 회 돌이를 지나서 진행하지는 않습니다. 이클립스에서 디버깅을 시도했다. 모든 메시지를 읽은 후, 루프 동안 멈춘다.프로세스가 읽기에서 멈춤

색인은 각 프로세스에 할당 된 번호입니다. 첫 번째 프로세스는 인덱스 == 0을가집니다. 메시지 자체는 단순히 메시지를 보내는 프로세스의 인덱스입니다.

while((n = read(fd[index][0], &mymsg, sizeof(int))) == sizeof(int)) 
     printf("process%d has received a message from process%d\n", index, mymsg); 

왜 이런 일이 발생하는지 알고 싶습니다. 여기

각 프로세스가 다른에 기록하는 방법입니다

// Write to other process 
if(write(fd[index2][1], &index, sizeof(int)) != sizeof(int)) 
    sys_error(2); 

이 다섯 번 이루어집니다. fd는 각 프로세스의 읽기 및 쓰기 종료 테이블입니다.

+0

이것이 왜 당신이 기대하는 행동이 아닌지는 명확하지 않습니다. 어떤 조건에서 코드는'while' 루프를 지나쳐야할까요? –

+0

@DavidSchwartz 바이트를 읽지 않으면 오류가 반환됩니다. – sj755

+0

그런 일이 일어날 것으로 기대되는 특별한 이유가 있습니까? 그렇지 않다면 왜 while 루프를 종료해야합니까? –

답변

5

더 많은 데이터가 나타날 때까지 read()에 대한 호출이 차단됩니다. man page for pipe

에서 프로세스는 것까지 데이터 블록이 사용 가능할 빈 파이프로부터 판독 한 후 (2)를 판독하려고하는 경우. 프로세스가 전체 파이프 (아래 참조)에 쓰기를 시도하면 쓰기가 완료되도록 충분한 데이터가 이 파이프에서 읽힐 때까지 블록을 씁니다 (2). 비 블로킹 fcntl (2) F_SETFL 작업을 사용하여 OWONBLOCK 열린 파일 상태 플래그 을 활성화하면 입출력이 가능합니다. 당신은 루프가 각 사람에게이 작업을 수행하는 동안 것을 입력하기 전에 각 파일 기술자를 열면

:

fcntl(fd, F_SETFL, O_NONBLOCK); 

을하지만, 당신은 정말 차단에 위로 읽어야 대 I/O를 포함한 비 차단 read, fcntl 등의 매뉴얼 페이지를 읽는 것.

+0

몇 가지 예제 코드가 있습니까? 나는 그 기능에 너무 익숙하지 않다. – sj755

+0

@ seljuq70 : fctntl 매뉴얼 페이지를 사용해 보셨습니까? 나는 'fcntl F_SETFL O_NONBLOCK'을 Google에 입력하고 샘플 코드로 몇 가지 히트 곡을 얻었습니다. 어쨌든 나는 좀 더 많은 정보를 추가하기 위해 나의 대답을 편집했다. – kbyrd

+0

나는 이것을 읽기 전에 시도했다 : fcntl (fd [index] [0], F_SETFL, O_NONBLOCK); 어떤 이유로 프로세스 0이 더 이상 아무것도 인쇄하지 않습니까? – sj755