2014-11-16 8 views
0

mkfifo()이 성공했지만 파이프로 작업 중이며 파이프 하나가 열리지 않습니다.open()의 오류를 보는 방법

나는이 있습니다

/* create the FIFO (named pipe) */ 
int ret_mk = mkfifo(out_myfifo, 0666); 
if(ret_mk < 0) { 
    perror(out_myfifo); 
    unlink(out_myfifo); 
    return -1; 
} 

printf("ret_mk = %d\n", ret_mk); 
/* write to the FIFO */ 
out_fd = open(out_myfifo, O_WRONLY); 
printf("out_fd = %d\n", out_fd); 

을하지만 아무것도 표시되지 않습니다, open() 후 임의의 텍스트 심지어 인쇄 인쇄가되지됩니다. here에서

우리는이 :

open() 기능은 파일을 참조하는 데 사용되는 정수 값을 반환합니다. 성공하지 못하면 -1을 리턴하고 오류 유형을 나타내도록 전역 변수 errno을 설정합니다.

열리지 않는 이유는 무엇입니까?

+1

'mkfifo()'가 어떻게 성공했는지 알 수있는 코드가 표시되지 않습니다. 'mkfifo()'에 의해 리턴 된 값을 포착하거나 테스트해야하고'mkfifo()'가 성공했음을 알기 위해서는 0 이었음을 증명해야한다. 그리고 여러분이 알다시피, 만약 파일 기술자 번호가 출력되지 않는다면, FIFO가 읽혀 지도록 프로세스가 없기 때문에'open()'이 완료되지 않았기 때문입니다. –

답변

2

fifo(7)을 읽으십시오. FIFO의 경우 open 호출이 차단 될 수 있습니다.

out_fd = open(out_myfifo, O_WRONLY|O_NONBLOCK); 
if (out_fd<0) perror(out_myfifo); 
printf("%d\n", out_fd); 

그러나 당신이 원하는 일반적으로, 일부 다른 프로세스가 읽기에 대한 같은 FIFO를 open해야하기 때문에하는 FIFO에 쓰기위한 open 차단 (: 플래그 인수에 O_NONBLOCK를 사용 open(2) 비 차단을 만들려면 글쓰기 과정이 그 일이 일어날 때까지 기다리 길 원한다).

누군가 다른 사람이 FIFO의 다른 쪽 끝을 열었다는 것을 알 수 없습니다 (poll은 열린 파일 설명자를 원하므로). 참조 : inotify(7); unix(7) 소켓을 사용할 수도 있습니다.

의견 : 디버그를 위해 strace(1)을 사용할 수도 있습니다.

intro(2)Advanced Linux Programming도 참조하십시오.

+0

좋아, 차단하는 것이 무슨 뜻인지 알 겠어. 내 질문에 왜 투표가 내려 졌는지 알아? – gsamaras

+0

RTFM 때문에 추측됩니다. 나는 당신의 질문을 downvote하지 않았지만 대답은 man 페이지에서 즉시 얻을 수있는 질문은 "연구 노력을 보여주는 것"이 ​​아니다. –

+0

내가 언급 한 내용은 그것을 다루지 않았다. 어쨌든, 그 질문은 사이트에 도움이되지 않습니다,하지만 당신의 대답 때문에 그것을 삭제할 수 없다는 것을 의미합니다, 지금 내가 뭘해야합니까? :/그런데, -1이라고 생각하니? – gsamaras