`mknod`에 의해 생성 된 명명 된 파이프와`mkfifo`에 의해 생성 된 FIFO는 동등합니까? 사용했습니다 . 이제 mknod명령이 명명 된 파이프를

mkfifo <file>하나의 프로세스가 파일에 쓰고 다른 프로세스는 파일에서 읽는 명명 된 FIFO를 작성 하는 명령을 사용했습니다 .

이제 mknod명령이 명명 된 파이프를 만들 수 있다는 것을 알고 있습니다. 이 명명 된 파이프는에 의해 생성 된 FIFO와 동등 mkfifo합니까, 아니면 다른 기능이 있습니까?



답변

그렇습니다. 물론 mknod블록이나 문자 장치가 아닌 실제로 FIFO를 만들 라고 말한 경우에만 해당됩니다 (요즘 devtmpfs / udev가 수행하는 것처럼 드물게 수행됨).

mkfifo foobar
# same difference
mknod foobar p

에서 strace이 두 명령에 대해 동일입니다 :

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

따라서 syscall과 관련하여 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.


답변

이식성의 극단적 인 가장자리를 제외하고는 동등합니다. mknod ... p원래 이름이 지정된 파이프를 생성하는 유일한 방법 이었지만 POSIX는 파이프를 생략하고 mkfifo대신 발명하기로 결정했습니다. 이름이 지정된 파이프는 다른 물건 mknod이 장치 및 주요 및 부수로 할 수있는 모든 것보다 본질적으로 더 휴대하기 쉬운 개념이기 때문일 것 입니다. mknod시스템 호출은 POSIX의 초기 verions에서 제외되었다.

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