![[重複]から読み取るときにコードを実行する特別なファイルを作成する方法](https://linux33.com/image/56108/%5B%E9%87%8D%E8%A4%87%5D%E3%81%8B%E3%82%89%E8%AA%AD%E3%81%BF%E5%8F%96%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AB%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E7%89%B9%E5%88%A5%E3%81%AA%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95.png)
Linuxシステムのほとんどのファイルは通常のファイルです。つまり、ディスクに保存され、ディスク上の指定されたメモリブロックからのみそのファイルを読み込みます。ファイルのように動作し、通常のファイルのように読み取ることができますが、実際にプログラムで生成されたデータを返す項目を作成するにはどうすればよいですか?具体的な例として、現在google.comをダウンロードしてそれを返すファイルは、cat ~/myspecialfile
google.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
ファイルシステムのマウントポイントになります。