fifo에 쓰기가 차단되지 않았습니다. [닫기]

fifo에 쓰기가 차단되지 않았습니다. [닫기]

간단한 프로그램이 있어요

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---------. 따라서 openEACCESS 오류로 인해 실패하고 -1EINVAL 오류로 인해 fd파일 설명자에 쓰기가 실패합니다.-1

관련 정보