私は標準入力と出力で別のプログラムと通信する必要のあるプログラムを用意しています。パイプを使用して入力を送信し、指定されたファイルにその出力をリダイレクトして完了したら読み込み、正常に動作します。私は私のプログラムが少なくともWindowsとLinuxでいくらか働くようにしたいのでパイプとdup2を使用していません。popenが期待どおりに動作しない
私の問題は、データをストリームするためにパイプを使いたいということです。
私は、次のコードを試みた:私は何をすべきかに関係なく、私はちょうどファイルのうち、ヌルを得続けるしかし
#include <unistd.h>
#include <stdio.h>
int main()
{
int x;
FILE *p = popen("./test > tmp.datafile", "w");
FILE *f = fopen("tmp.datafile", "r");
for (int i = 0; i < 100; ++i) {
fprintf(p, "%d", i);
sleep(1);
x = fgetc(f);
printf("%c ", x);
fflush(0);
}
fclose(f);
pclose(p);
return 0;
}
:と一緒に
#include <stdio.h>
int main()
{
while (!feof(stdin)) {
int x;
scanf("%d", &x);
printf("%x ", x);
fflush(0);
}
return 0;
}
を。テスト実行ファイルがフラッシュされる前にファイルを読み込もうとすると同時実行性の問題があると思われますが、これを修正する方法がわかりません。
cで標準ストリーム経由でプログラムと通信する方がいいですか?
実は、あなたには、いくつかの[イベントループ]で[投票を(2)](http://man7.org/linux/man-pages/man2/poll.2.html)を使用する必要があります(HTTPS:/ /en.wikipedia.org/wiki/Event_loop)。 http://advancedlinuxprogramming.com/と[this](http://stackoverflow.com/a/20582916/841108)の回答をお読みください。 –
私はファイルをポーリングすることは考えていませんでした。どのように似たようなWindowsのポーリングがLinuxにあるのか知っていますか?私は窓のpopenはほぼ同じですが、確かに投票についてはわかりません。 – LambdaBeta
Windowsはまったくわかりませんが、[POCO](http://pocoproject.org/)や[Qt](http://qt.io/)や[GLIB](https:// developer.gnome.org/glib/stable/)(あるいは[libevent](http://libevent.org/)....)は、クロスプラットフォームであり、助けてください。 [名前付きパイプ](https://en.wikipedia。org/wiki/Named_pipe) –