FIFO, 파이프 및 Unix 도메인 소켓은 Linux 커널에서 동일한 것입니까?

FIFO, 파이프 및 Unix 도메인 소켓은 Linux 커널에서 동일한 것입니까?

FIFO라는 이름이 파이프라고 들었습니다. 그리고 그것들은 정확히 동일한 의미를 가지고 있습니다. 반면에 Unix 도메인 소켓은 파이프와 매우 유사하다고 생각합니다(비록 사용한 적은 없지만). 그래서 둘 다 Linux 커널에서 동일한 구현을 참조하는지 궁금합니다. 어떤 아이디어가 있나요?

답변1

UNIX 도메인 소켓과 FIFO는 구현의 일부를 공유할 수 있지만 개념적으로는 매우 다릅니다. FIFO는 매우 낮은 수준에서 작동합니다. 한 프로세스는 파이프에 바이트를 쓰고 다른 프로세스는 파이프에서 바이트를 읽습니다. UNIX 도메인 소켓은 TCP/IP 또는 UDP/IP 소켓과 유사하게 동작합니다.

소켓은 양방향이며 많은 프로세스에서 동시에 사용할 수 있습니다. 프로세스는 동일한 소켓에서 여러 연결을 허용하고 여러 클라이언트를 동시에 처리할 수 있습니다. 커널은 매번 새로운 파일 설명자를 전달 connect(2)하거나 accept(2)소켓에서 호출됩니다. 패킷은 항상 올바른 프로세스로 이동합니다.
FIFO에서는 이것이 불가능합니다. 양방향 통신을 위해서는 두 개의 FIFO가 필요하고 각 클라이언트에는 한 쌍의 FIFO가 필요합니다. 쓰기나 읽기는 보다 원시적인 형태의 의사소통이기 때문에 선택적으로 쓸 수 있는 방법은 없습니다.

익명 파이프는 FIFO와 매우 유사합니다. 차이점은 익명 파이프는 파일 시스템에 파일로 존재하지 않으므로 어떤 프로세스도 open(2)그렇게 할 수 없다는 것입니다. 다른 방법을 통해 공유하는 프로세스에서 사용됩니다. 프로세스가 파이프를 생성한 다음 a 를 실행하면 fork(2)해당 하위 프로세스는 파이프를 포함한 파일 설명자를 상속합니다. (명명된 파이프/FIFO에 대한 파일 설명자도 같은 방식으로 전달될 수 있습니다.)

UNIX 도메인 소켓, 익명 파이프 및 FIFO는 커널 처리 시스템 호출 및 메커니즘 추상화와 함께 파일 설명자를 사용하여 프로세스 간 통신을 제공한다는 점에서 유사합니다.

답변2

여기에 좋은 토론이 있습니다.http://www.slideshare.net/divyekapoor/linux-kernel-implementation-of-pipes-and-fifos

내가 아는 한(프레젠테이션 슬라이드나 출처 중 하나)http://lxr.free-electrons.com/source/fs/pipe.c) FIFO는 파이프 주위의 래퍼로 구현되며, 그 자체는 pipefs가상 파일 시스템을 통해 구현됩니다.

@lgeorget - 파이프는 ("공유 메모리"가 아닌) 판독기와 기록기 사이의 버퍼로 커널 메모리를 사용하는 것으로 보이며 사용자와 커널 주소 공간 사이에서 메모리를 복사합니다(예: pipe_readcall pipe_iov_copy_to_user, 차례로 call __copy_to_user_inatomic(또는 copy_to_user). __copy_to_user_inatomicCall copy_user_generic, 이는 여러 ASM 구현 중 하나입니다.

답변3

"선입 선출"과 "명명 된"파이프"는 같은 것입니다. 하지만 쉘이 명령줄의 두 명령 사이에서 "파이프"(|)를 처리하는 방식과는 매우 다릅니다.

명명된 파이프(FIFO)는 두 프로그램이 공유하는 단일 "파일"입니다. 한 프로그램은 여기에 쓰고 다른 프로그램은 읽습니다. 반면에 소켓은 두 "파일" 사이에 있습니다. - 이것은 네트워크를 사용하고 다른 컴퓨터에 있을 수 있습니다. 하나의 프로그램은 하나의 "파일"을 읽고 쓰는 것이고 다른 프로그램은 다른 "파일"을 읽고 쓰는 것입니다... 나는 그들이 너무 비슷하다고 생각하지 않습니다... 다른 한편으로는 파일, 장치, 심볼릭 링크뿐만 아니라 핸드 소켓과 명명된 파이프도 모두 inode를 사용하며 모두 몇 가지 공통 기능(예: 읽기 및 쓰기)을 구현합니다.

답변4

내 2센트... FIFO와 UNIX 소켓은 모두 양방향(유사)이지만 소켓에는 스타 토폴로지가 있는 반면 FIFO는 대기열일 뿐이므로(교환할 수 없음) 그렇습니다. 구현은 내부적으로 코드를 공유할 수 있습니다.

**

char * myfifo = "/tmp/myfifo";
mkfifo(myfifo, 0666);
fd = open(myfifo, O_RDWR);   //so that you can read/write to it
 ...
write(fd, buff1, sizeof(buff1));  
getchar();//wait till some one reds this and writes something else
int sz=read(fd, buff1, sizeof(buff1));  //read that something**

관련 정보