![fifo에 쓰기가 차단되지 않았습니다. [닫기]](https://linux55.com/image/118851/fifo%EC%97%90%20%EC%93%B0%EA%B8%B0%EA%B0%80%20%EC%B0%A8%EB%8B%A8%EB%90%98%EC%A7%80%20%EC%95%8A%EC%95%98%EC%8A%B5%EB%8B%88%EB%8B%A4.%20%5B%EB%8B%AB%EA%B8%B0%5D.png)
간단한 프로그램이 있어요
int main () {
int fd;
int i, rc;
i = 0;
rc = mkfifo ("fff", 0);
fd = open ("fff", O_WRONLY);
fprintf(stdout,"open fifo fff succeeded\n"); fflush (stdout);
while (i<8)
{
rc = write (fd, "abcdefg", 8);
fprintf(stdout,"write to 'fff' returned with rc=%d\n",rc); fflush (stdout);
i++;
}
close (fd);
return 0;
}
Unbuntu 16.04, Linux myserv 4.4.0-81-generic #104-Ubuntu SMP에서 실행했고 다음 결과를 얻었습니다.
open fifo fff succeeded
write to 'fff' returned with rc=-1
write to 'fff' returned with rc=-1
write to 'fff' returned with rc=-1
write to 'fff' returned with rc=-1
write to 'fff' returned with rc=-1
write to 'fff' returned with rc=-1
write to 'fff' returned with rc=-1
write to 'fff' returned with rc=-1
열기와 쓰기 모두 비차단이며 이를 읽기 위해 열려 있는 프로세스가 없음을 보여줍니다. 리눅스 매뉴얼 페이지에 따르면,
. . . 그러나 입력 또는 출력 작업을 수행하려면 먼저 양쪽 끝이 열려 있어야 합니다. 읽기 위해 FIFO를 열면 일반적으로 다른 프로세스가 쓰기를 위해 동일한 FIFO를 열 때까지 차단되며 그 반대의 경우도 마찬가지입니다.
갈등을 겪고 있는 것 같습니다. 내가 놓친 것이 있나요? 이에 대한 설명을 기대합니다. 또한 FIFO에 대한 "쓰기 차단" 구현에 대한 제안 사항이 있습니까?
답변1
규칙 #1: 수행하는 모든 작업을 이해하려면 매뉴얼 페이지를 읽으십시오.
규칙 #2: 의심스러우면 실행하세요 ls -la
.
규칙 #3: 프로그램을 디버깅할 때 모든 변수를 인쇄하세요.
규칙 #3a: 실제로 성공했는지 먼저 확인하지 않고는 성공했다고 선언하지 마세요.
두 번째 매개변수 mkfifo
는모델. 모드(권한)가 0인 FIFO를 생성하고 있습니다 p---------
. 따라서 open
EACCESS 오류로 인해 실패하고 -1
EINVAL 오류로 인해 fd
파일 설명자에 쓰기가 실패합니다.-1