2012-06-24 1 views
1

C++ 코드에서 FIFO 버퍼를 사용하고 싶습니다. 두 프로세스가 있으며, 그 중 하나는 항상 FIFO에 쓰고 다른 프로세스는 항상 읽습니다. 매우 간단합니다.C++에서 메모리 작업없이 FIFO에서 읽기

버퍼의 내용을 읽을 필요가 없습니다. 얼마나 많은 데이터가 들어 있는지 알고 싶습니다.

C++에서 가장 복잡한 솔루션은 무엇입니까?

이 코드는 잘 작동하지만 난 버퍼의 내용 필요가 없습니다 :

int num; 
char buffer[32]; 

num = read(FIFO, buffer, sizeof(buffer)); 
//num is the important variable 

가 감사를!

+0

게시물이 분명하지 않습니다. 이 FIFO는 무엇입니까? 달성하고자하는 것은 무엇입니까? –

+1

어떤 종류의 프로세스 간 프로토콜은 버퍼 길이를 사용하여 중요한 변수를 전달합니까? –

+0

FIFO는 mkfifo 기능으로 작성된 파일 설명 자입니다. 하나의 프로세스가 FIFO에 지속적으로 쓰고 있으며, 다른 하나는 FIFO에서 읽는 중입니다. 나는 다른 과정이 아직 살아 있다는 것을 알아야합니다. 이것이 버퍼 자체가 전혀 중요하지 않은 이유입니다. 읽을 수만 있다면 괜찮아. – Daniel

답변

-1

내가 맞는지 잘 모르겠다면, 정교한 - 가장 효율적입니까, 아니면 가장 혼란 스럽습니까?

어쨌든 버퍼 내용이 필요하지 않은 경우 - (공유 된) 연동 변수 만 사용할 수 있습니다.

+1

-1 : 답변은 어디에 있습니까? 당신은 가치있는 조언을하지 않습니다. –

+0

@Kirill Kobelev : 당신 말이 맞아요, 완전한 대답은 아니지만 ** ** IMHO라는 귀중한 조언입니다. 공유 메모리 영역을 만듭니다 (API는 OS에 따라 다릅니다) ** 공유 메모리에 속한 단일 정수 변수에 ** ** 연동 (즉, 잠금, 메모리 복사 등)하지 않습니다 **. – valdo

0

필자가 알고있는 한, 리눅스 FIFO (FIFO를 없애기에 부족함)에서 바이트를 지우는 유일한 방법은 그들을 읽는 것이다. 한 번에 더 많은 양의 데이터를 읽으면 더 빨리 지울 수 있습니다 (보통 FIFO에 쓰여지는 크기가 아닌 한 32은 매우 작은 읽기 크기입니다). 블로킹 모드에있는 경우 Robert Mason이 지정한 링크에 설명 된대로 바이트를 쿼리해야합니다. 설명자가 비 블로킹 모드 인 경우, EAGAIN이 반환되어 지워 졌음을 알 수 있습니다. FIFO에 더 많은 데이터가 도착했는지 확인하려면 poll을 사용할 수 있습니다.

0

파이프를 지울 수있는 유일한 방법은 그것을 읽는 것입니다. 그래서 얼마나 많은 바이트가 있는지에 대한 의문이 들지 않습니다. 당신이 그것을 읽은 후에 알게 될 것입니다. 실제 문제는 모든 읽기와 동일하게 끝납니다.

(1) 데이터를 신경 쓰지 않는다면 대기를 차단하고 싶지 않으므로 FIFO를 비 차단으로 설정하십시오.

(2) FIFO를 폴링하여 읽는 시간이 있는지 확인하기 위해 앉아서 낭비하고 싶지 않으므로 FIFO fd를 select 문에 넣어야합니다. 읽을 것이 있으면 배수하고 카운터에 추가하십시오.