バックグラウンドで実行されているプロセスにコマンドをパイプする方法は?

バックグラウンドで実行されているプロセスにコマンドをパイプする方法は?

これはバックグラウンドで実行され、コマンドを待つループプログラムです。

#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 &

パイプを介してこのプロセスにコマンドを送信するにはどうすればよいですか?

ベストアンサー1

私はこれが「実際の」パイプラインでは不可能だと思います。

man mkfifo代わりに、FIFO(名前付きパイプ、参考資料を参照)、または(よりエレガントだがより複雑な)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

forkFIFOに比べて利点は、(サーバー側のオプションを使用して)クライアントの接続を切断して再接続できることです。 FIFOでは、受信側を引き続き実行するにはいくつかのトリックが必要です。

while true; do cat /path/to/fifo; done | background_prog

おすすめ記事