サブプロセスが読み込んだファイルの代わりに匿名パイプを使用しようとしています。私が抱えている問題は、「ファイル」(パイプ)の終わりに達していないことを認識していないため、サブプロセスがハングすることです。作品の上に与えられたとしてpopen with/dev/fd/n匿名パイプがサブプロセスをハングする
#include <stdio.h>
#include <unistd.h>
#include <sys/fcntl.h>
int main()
{
int pipefd[2];
pipe(pipefd);
fcntl(pipefd[0], F_SETFL, O_NONBLOCK); // necessary?
char cmd[128];
snprintf(cmd, sizeof(cmd), "cat /dev/fd/%i", pipefd[0]);
printf("Command: %s\n", cmd);
#if 1
// This works
write(pipefd[1], "line1\n", 6);
write(pipefd[1], "line2\n", 6);
write(pipefd[1], "line3\n", 6);
close(pipefd[1]);
#endif
FILE* fp;
if ((fp = popen(cmd, "r")) != NULL)
{
// fcntl(fileno(fp), F_SETFL, O_NONBLOCK); // causes SIGPIPE
#if 0
// This doesn't work
write(pipefd[1], "line1\n", 6);
write(pipefd[1], "line2\n", 6);
write(pipefd[1], "line3\n", 6);
close(pipefd[1]);
#endif
char buffer[1024];
while (fgets(buffer, sizeof(buffer), fp) != NULL)
printf("%s", buffer);
printf("retcode: %i\n", pclose(fp));
}
close(pipefd[0]);
return 0;
}
コード:ここで
は私がやっているのいくつかのサンプルコードです。その中で私はパイプを作成し、パイプの読み込み側を使ってコマンドを作成します。この場合はcat
です。作業バージョンでは、次にパイプの書き込み側にデータを書き込みます
popen
を使用してサブプロセスを開始し、終了するまでサブプロセスからstdoutを読み取ります。
(#if 0
ブロックを参照)の作成後に、のパイプへの書き込みを移動する必要があります。最終的には、別のスレッドで終了します。ただし、popen
コールの後に切り替えると、サブプロセスが終了(ハングアップ)せず、理由がわかりません。
私はさまざまなストリームを非ブロック化しようとしましたが、サブプロセスストリームでこれを行うと、SIGPIPEエラーが発生するだけです。
誰でもこの方法を知っていますか?
ありがとうございます!
popenを実行する前にpipefd [1]のFD_CLOEXECフラグを設定します。 –
すばらしい!ありがとう!!あなたはその答えをしたいと思いますし、私はそれをマークするでしょう! –