2014-04-12 2 views
1

현재 OS 숙제로는 "unistd.h""sys/wait.h"을 사용하는 파이프로 작업하고 있습니다. 그래프 파이프를 구현하려고합니다.글자 단위로 버퍼에서 글자로 글자 읽기/파이프에서 데이터 크기 찾기

그래프 파이프에서 프로세스의 출력을 하나 이상의 프로세스에 입력으로 보낼 수있는 가능성이 있으므로 버퍼에 저장하고 루프에서 보내야합니다.

프로세스 출력을 읽으려면 read() 함수를 사용합니다. 문제는 출력의 문자 수가 가변적이어서 한 문자 씩 읽거나 출력 크기를 찾는 것입니다.

첫 번째 옵션을 시도하고 있습니다. 여기 내 코드가

string buffer; 
char temp[1]; 
while (/*condition*/) 
{ 
    read (pipe[0], temp, 1); 
    buffer.push_back (temp[0]); 
} 

내 질문은 무엇이 루프 내부에 있어야합니까?

P. 두 번째 옵션이 더 쉬운 경우 파이프에서 프로세스의 출력 크기를 어떻게 확인할 수 있습니까?

답변

1

조건 정말 read 호출의 반환입니다 :

char temp; 
while (read(pipe[0], &temp, sizeof(temp)) == sizeof(temp)) { ... } 
: 또한

while (read(...) == 1) { ... } 

운영자 주소의 잊지 마세요, 당신은 대신 배열로 temp 선언의 것을 사용할 수 있습니다

+0

무한 루프가 발생합니다. –

+0

@KudayarPirimbaev 파이프의 쓰기 끝이 절대로 끝나지 않는 한 그렇지 않아야합니다. 파이프의 끝을 닫으면 (판독기가) 나머지 데이터를 읽었을 때'read'는 0을 반환합니다. 그리고 물론'read'는 에러시'-1'을 반환합니다.이 두 값은'sizeof (temp) '와는 매우 다릅니다. –

+0

@KudayarPirimbaev 또 다른 가능성은 글쓰기가 단순히 아무 것도 쓰지 않는다는 것입니다. 그런 다음 '읽기'가 차단되어 반환되지 않습니다. 이는 무한 루프처럼 보일 수 있습니다. 좋아하는 검색 엔진을 열고 예를 들어 검색하십시오. "posix non blocking descriptor"를 사용하여 파일 디스크립터를 non-blocking으로 만드는 법과 그것을 사용하는 법을 배우십시오. –