`mknod`에 의해 생성 된 명명 된 파이프와`mkfifo`에 의해 생성 된 FIFO는 동등합니까?


22

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

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

답변:


29

그렇습니다. 물론 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.


16
OP는 확실히 신경 쓰지 않지만 Q는 [linux]로 태그되어 있지 않기 때문에 BSD에서 mkfifo(2) 실제로는 별도의 시스템 호출이라는 mknod(2)것을 알 수 mknod(S_FIFO)있습니다.
mosvy

@frostschutz-훌륭한 답변 감사합니다. 그래서 명료하게하기 위해서입니다. mkfifomknod사용하는 프로그램 실제로 mknod는 FIFO를 만들기 위해 (오늘 전에 해당 시스템 호출을 알고하지 않았다) 시스템 호출은. "FIFO"와 "named"라는 용어를 서로 바꿔서 사용할 수 있습니다. 그들은 같은 것입니까? 양방향 명명 된 파이프는 Unix 도메인 소켓을 통해 구현됩니다.
Shuzheng

예, "명명 된 파이프"와 FIFO는 일반적으로 같은 것을 말합니다 (파이프의 맥락에서 -FIFO는 파이프 외부에도 존재 하는 개념 입니다). 소켓은 완전히 다른 짐승입니다. 여기에 대한 흥미로운 답변이 있습니다 : unix.stackexchange.com/q/75904/30851
frostschutz

@frostschutz-감사합니다. 가장 혼란스러운 것은 명명 된 파이프를 생각할 때 양방향 파이프도 생각한다는 것입니다 .FIFO는 확실히 양방향이 아닙니다 (AFAIK).
Shuzheng

@Shuzheng FIFO는 실제로 방향에 대한 규칙이 없습니다. 실제로 읽고 쓰는 것입니다. 많은 독자와 작가가있을 수 있지만 쓰여진 모든 내용은 한 번만 읽을 수 있으므로 누가 데이터를 최종적으로 가져올 지 불분명합니다.
frostschutz

18

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.