O_CREAT를 사용하는 sem_open이 때때로 EBADF에서 실패하는 다중 스레드 프로그램이 있습니다. 이것은 NXP의 ARM Linux 4.9.88 임베디드 장치에 있습니다.
재현하기가 매우 어렵지만 파일을 생성할 때 두 스레드가 동일한 파일 설명자를 수신하는 것처럼 보이는 strace 상황을 발견했습니다(하나는 sem_open 내부의 openat()에 대한 것이고 다른 하나는 슬레이브 파이프라인2에 의해 반환된 읽기 끝). 파일과 파이프라인이 동시에 존재합니다.
strace(pid 266은 sem_open을 호출하는 스레드이고, pid 268은 popen을 호출하는 또 다른 스레드입니다)는 다음을 보고합니다.
[pid 266] openat(AT_FDCWD, "/dev/shm/pPC113", O_RDWR|O_CREAT|O_EXCL, 0777 <unfinished ...>
[pid 268] close(12) = 0
[pid 268] mq_timedreceive(10, "\0\0\0\0\1g\7\0", 8, NULL, NULL) = 8
[pid 266] <... openat resumed> ) = 12
[pid 268] pipe2([12, 13], O_CLOEXEC) = 0
openat() 및 파이프라인2()는 서로 다른 설명자를 반환해야 하지만 설명자 12를 반환합니다.
그런 다음 sem_open은 설명자 12에 쓰기를 시도하고 EBADF를 수신합니다. 아마도 설명자 12가 생성된 파일이 아니라 파이프의 읽기 끝이기 때문일 것입니다.
이것은 나에게 명백한 커널 버그처럼 보입니다. 오픈 및 파이프라인 모두 동일한 파일 설명자를 반환합니다. 이것이 알려진 버그이고 이후 버전의 커널에서 수정되었는지 아는 사람이 있습니까?