`mkfifo`로 생성된 FIFO와 동일하게 `mknod`로 생성된 명명된 파이프가 있습니까?

`mkfifo`로 생성된 FIFO와 동일하게 `mknod`로 생성된 명명된 파이프가 있습니까?

mkfifo <file>명령을 사용하여 한 프로세스가 파일에 쓰고 다른 프로세스가 파일에서 읽는 명명된 FIFO를 만들었습니다.

이제 이 mknod명령으로 명명된 파이프를 생성할 수 있다는 것을 알았습니다. 이러한 명명된 파이프는 생성된 FIFO와 동일합니까 mkfifo, 아니면 다른 기능을 가지고 있습니까?

답변1

예, 그것들은 동일하지만 블록이나 문자 장치가 아닌 실제로 FIFO를 생성하도록 지시한 경우에만 분명히 가능합니다 mknod(devtmpfs/udev가 이를 수행하기 때문에 요즘에는 거의 수행되지 않습니다).

mkfifo foobar
# same difference
mknod foobar p

strace두 명령은 동일합니다.

mknod("foobar", S_IFIFO|0666)           = 0

따라서 시스템 호출 측면에서 mkfifo실제로는 mknod.

음, 가장 큰 차이점은 의미론입니다. mkfifo한 번에 여러 개의 FIFO를 생성할 수 있습니다 .

mkfifo a b c

의 경우 mknod유형을 지정해야 하므로 하나의 인수만 허용됩니다.

# wrong:
$ mknod a b c p
mknod: invalid major device number ‘c’
# right:
mknod a p
mknod b p
mknod c p

일반적으로 mknod올바르게 사용하기 어려울 수 있습니다. 따라서 FIFO를 사용하고 싶다면 계속 사용하십시오 mkfifo.

답변2

이식성의 극단을 제외하고는 동일합니다. mknod ... p원래 명명된 파이프를 생성하는 유일한 방법이었던 POSIX는 이를 무시하고 이를 발명하기로 결정했습니다 mkfifo. 아마도 명명된 파이프는 본질적으로 mknod장치와 해당 장치의 메이저 및 마이너 번호에 수행할 수 있는 다른 모든 작업보다 더 이식 가능한 개념이기 때문일 것입니다. mknodPOSIX의 초기 버전도 시스템 호출을 생략했습니다.

따라서 고대 UNIX의 이식성을 위해서는 mknod ... p더 좋습니다. 최신 시스템의 경우 mkfifo약간 더 좋지만 mknod ... p작동하지 않는 실제 최신 UNIX를 찾을 가능성은 거의 없습니다.

관련 정보