이 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
장치와 해당 장치의 메이저 및 마이너 번호에 수행할 수 있는 다른 모든 작업보다 더 이식 가능한 개념이기 때문일 것입니다. mknod
POSIX의 초기 버전도 시스템 호출을 생략했습니다.
따라서 고대 UNIX의 이식성을 위해서는 mknod ... p
더 좋습니다. 최신 시스템의 경우 mkfifo
약간 더 좋지만 mknod ... p
작동하지 않는 실제 최신 UNIX를 찾을 가능성은 거의 없습니다.