[중복]에서 읽을 때 코드를 실행하는 특수 파일을 만드는 방법

[중복]에서 읽을 때 코드를 실행하는 특수 파일을 만드는 방법

Linux 시스템의 대부분의 파일은 일반 파일입니다. 즉, 디스크에 저장되어 있으며 디스크의 지정된 메모리 블록에서만 해당 파일을 읽습니다. 파일처럼 작동하고 일반 파일처럼 읽을 수 있지만 실제로 프로그래밍 방식으로 생성된 데이터를 반환하는 항목을 만들려면 어떻게 해야 합니까? 구체적인 예로, 현재 google.com을 다운로드하고 이를 반환하는 파일은 cat ~/myspecialfilegoogle.com의 내용을 stdout으로 출력합니까?

답변1

다른 답변에서 알 수 있듯이 명명된 파이프를 사용하여 요청한 내용의 일부를 수행할 수 있습니다. 완전한 솔루션을 위해서는 일종의 개발이 필요합니다.가상 파일 시스템가상 파일 시스템의 경로에 액세스하면 필요한 작업을 수행합니다. 이를 수행하는 방법에는 여러 가지가 있습니다.

  • 커널 모드 파일 시스템 드라이버를 작성하세요.프로세스 파일 시스템운전사.
  • 다음을 사용하여 사용자 모드 파일 시스템 구현을 작성합니다.퓨즈예를 들어.
  • 제공하는 프로그램을 작성하세요.NFS 서버인터페이스 또는 기타 네트워크 파일 시스템 프로토콜.
  • USB 파일 저장 장치나 기타 하드웨어인 것처럼 가장하는 프로그램일 수도 있습니다.

답변2

아마도 FIFO/명명된 파이프를 사용하여 비슷한 작업을 수행할 수 있습니다.

$ mkfifo ~/myspecialfile
$ wget -q -O ~/myspecialfile google.com &
[2] 26186
$ 

mkfifo~/myspecialfile이라는 명명된 파이프를 만듭니다. wget그런 다음 출력은 해당 명명된 파이프로 전달됩니다. 해당 명명된 파이프에서 마치 일반 파일인 것처럼 한 번 읽을 수 있습니다. 예를 들어 wc다음 파일의 개수를 가져옵니다.

$ wc ~/myspecialfile
      7     430   17738 /home/ubuntu/myspecialfile
[2]+  Done                    wget -q -O ~/myspecialfile google.com
$ 

일반적으로 작성자( wget이 경우) 는 open()O_WRONLY 플래그가 있는 파이프를 사용합니다. 이 open()호출은 일반적으로 판독기( wc이 경우)가 O_RDONLY 플래그를 사용하여 파이프의 다른 쪽 끝을 열 때까지 차단됩니다. 따라서 여기서 프로세스는 wget즉시 시작되지만 독자가 (열고) 읽기를 시작할 때까지 백그라운드에서 아무 작업도 수행하지 않습니다. Ubuntu 14.04에서 Wireshark를 사용하여 이 동작을 확인했습니다.

답변3

myspecialfile명명된 파이프를 생성할 수 있습니다 . 그런 다음 프로그램의 출력을 반복하고 파이프에 쓰는 스크립트를 백그라운드에서 실행할 수 있습니다.

#!/bin/bash
mkfifo ~/myspecialfile
while :; do
    run program here > ~/myspecialfile
done

이것에는 한계가 있습니다. 두 프로세스가 동시에 파일을 열면 부분적인 출력만 얻을 수 있습니다.

이러한 제한이 없는 보다 정교한 접근 방식은 FUSE 파일 시스템을 구현하는 것입니다. ~/myfyspecialfile파일 시스템의 마운트 지점이 됩니다.

관련 정보