2012-07-05 3 views
0

IPC 용 FIFO를 사용하고 있습니다. 그러나 그들은 이상한 행동을합니다. 데모 스트 레이션에 관해서는 컴파일되고 실행될 수있는 몇 가지 코드를 게시합니다. 추가 정보, 저는 리눅스 우분투에서 기본 g ++ 컴파일러와 함께 제공됩니다. 특별한 것은 없습니다. 출력에 대한C++ FIFO 이상한 동작

#include <iostream> 
#include <sys/stat.h> 
#include <stdio.h> 
#include <fcntl.h> 
#include <iostream> 
using namespace std; 

int main() { 

    cout << "START" << endl; 

    int fifo; 
    int code; 
    mkfifo("/tmp/FIFO", 666); 
    if ((fifo = open("/tmp/FIFO", O_RDONLY | O_NONBLOCK)) < 0) { 
     perror("open failed"); 
    } 
    else { 
     cout << "open successed" << endl; 
     code = close(fifo); 
     cout << "close: " << code << endl; 
     if ((fifo = open("/tmp/FIFO", O_WRONLY | O_NONBLOCK)) < 0) { 
      perror("reopen failed"); 
     } 
     else { 
      cout << "reopen successed" << endl; 
      code = close(fifo); 
      cout << "close: " << code << endl; 
     } 
    } 

    cout << "END" << endl; 
    return 0; 
} 

내 기대 내가 성공적으로 종료하기 때문에,이 같은 것입니다 :

START 
open successed 
close: 0 
reopen successed 
close: 0 
END 

을하지만, 나는이있어, 두 번째 열린이 실패합니다. 왜? 그리고 왜이 바보 같은 오류 메시지로?

START 
open successed 
close: 0 
reopen failed: No such device or address 
END 

정말 FIFO를 다시 쓰고 싶습니다. 그리고 위의 코드가 작동하지 않는 이유를 알고 싶습니다.

+0

open()이 반환하고 실패한 후에 errno가 무엇인지보고 할 수 있습니까? 이것은 힌트를 줄 수 있습니다 .... – jwismar

+0

'... (실패시) -1이 반환되고 errno는 에러를 나타 내기 위해 설정됩니다.''errno'의 반환 값은 무엇입니까? – Marlon

+0

실제로 정확한 값을 알지 못합니다.하지만 perror가 코드 대신 메시지를 출력하기 때문에 필요하지 않습니다. ("해당 장치 또는 주소 없음"). – Daniel

답변

2

다시 열기에서 O_NONBLOCK 플래그를 제거하거나 플래그를 유지하려면 이미 읽기 용으로 열려있는 FIFO에 연결하십시오. 올바른 동작입니다.

http://linux.die.net/man/7/fifo

방법은 블로킹 모드에서 FIFO를 열 수있다. 이 경우 읽기 전용으로 열리는 것은 아무도 쓰기면에서 아직 열리지 않은 경우에도 성공합니다. 쓰기 끝내기는 다른 쪽 끝이 이미 열려 있지 않으면 ENXIO (해당 장치 또는 주소 없음)로 실패합니다.

+0

그게 전부 야! !!! 나는 다시 열기 전에 닫지 않을까 생각조차하지 않는다! 고맙습니다! – Daniel