これは私のループプログラムで、バックグラウンドで実行され、コマンドを待っています。
#include <iostream>
using namespace std;
char buffer[256];
int main(int argc, char *argv[])
{
while(true){
fgets(buffer, 255, stdin);
buffer[255] = 0;
if(buffer[0] != '\0'){
cout << buffer;
buffer[0] = '\0';
}
}
return 0;
}
私はそれを実行しました:
myLoop &
では、どうすればこのプロセスにコマンドをパイプできますか?
「本物の」パイプラインではそれは不可能だと思います。
代わりに、FIFO(名前付きパイプ、を参照man mkfifo
)または(よりエレガントですがより複雑な)Unixソケット(AF_UNIX)を使用できます。
./background-proc </path/to/fifo &
cat >/path/to/fifo
# typing commands into cat
私は開発者ではないので、ソケットとの唯一の関係はsocat
です。しかし、それは出発点として役立つかもしれません。
プログラムと通信する「サーバー」が必要です。このようなパイプラインはバックグラウンドで開始されます。
socat UNIX-LISTEN:/tmp/sockettest,fork STDOUT | sed 's/./&_/g'
これsed
はテスト用です。
次に、1つ以上を開始します
socat STDIN UNIX-CONNECT:/tmp/sockettest
バックグラウンドプログラムのコマンドを生成するプログラムがある場合は、ここでもパイプラインを使用します。
cmd_prog | socat STDIN UNIX-CONNECT:/tmp/sockettest
FIFOと比較した場合の利点は、(fork
サーバー側のオプションを使用して)クライアントを切断して再接続できることです。FIFOを使用すると、受信側を実行し続けるためのトリックが必要になります。
while true; do cat /path/to/fifo; done | background_prog
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加