さて、私はCで書かれた別のプログラムを実行するプロセスを起動するC#で書かれたプログラムを持っています。これで、CプログラムからstdoutをリダイレクトしてC#側でそれを取得することをすでに解決しました。 . しかし、C# プログラムが C プログラムに終了を伝える方法が必要です。私が最初に考えたのは、C プログラムはもともと conio.h から kbhit をテストすることで制御されていたので、stdin をリダイレクトして何かをストリームライトするだけで、キー ヒットを検出できるということでしたが、それは機能しませんでした (kbhit を推測しています)。リダイレクトには向いていません)、私は周りを検索しましたが、多くの人が PeekConsoleInput() を提案し続けました。そこで、kbhit の代わりに PeekConsoleInput を使用するように c プログラムを変更し、標準入力をリダイレクトしましたが、送信したものはまだ検出されませんでした。たとえば、Cで...
#include <stdio.h>
#include <windows.h>
int main() {
BOOL peeked = 0;
HANDLE input_handle = GetStdHandle(STD_INPUT_HANDLE);
DWORD events = 0; // how many events took place
INPUT_RECORD input_record; // a record of input events
DWORD input_size = 1; // how many characters to read
printf("Hello World\n");
fflush(stdout);
while (1) {
FlushConsoleInputBuffer(input_handle);
peeked = PeekConsoleInput(input_handle, &input_record, input_size, &events);
if (peeked && events>0) {
break;
}
}
printf("Hit Detected\n");
return 0;
}
そしてC#コードからのスニペット...
ProcessStartInfo info = new ProcessStartInfo("CTest.exe");
info.CreateNoWindow = true;
info.UseShellExecute = false;
info.RedirectStandardOutput = true;
info.RedirectStandardInput = true;
pro = new Process();
pro.StartInfo = info;
pro.Start();
StreamWriter sw = pro.StandardInput;
sw.AutoFlush = true;
pro.BeginOutputReadLine();
pro.OutputDataReceived += new DataReceivedEventHandler(pro_OutputDataReceived);
sw.WriteLine("Q");
C プログラムはそれ自体で実行されますが、C# プログラムが実行されると、「ヒット検出」に達することはありません。また、s.WriteLine("Q") を数秒遅らせて、タイミングの問題であり、それでも機能しないかどうかを確認しました。
理想的には、C プログラムを単独で実行できるようにするか、C# プログラムで実行できるようにしたかったのですが、C プログラムを単独で実行できなくても、それほど悪くはありません。
私が試みたものの1つは、C#プログラムにファイルを書き込むだけで、Cプログラムが正常に開くまでfopenでポーリングすることでしたが、このCプログラムの主な目的の1つは、データをディスクに書き込むことです非常に高速で、ディスクをポーリングすると速度が低下するのではないかと心配しています。
ちょっとうまくいったもう1つのことは、プロセスを閉じることでした。しかし、Cプログラムは閉じる前にいくつかのものをクリーンアップする必要があるため、面倒です(シャットダウンする前にCプログラムにコードを実行させる方法がない限り、それができるかどうかはわかりません)。
これを実現する他の方法は、ソケット、パイプなどですが、1 ビットの信号だけでは大変な作業のように思えます。また、それを行う方法について私が見つけたすべての例は、2 つの C# プログラムを通信させる方法、または 2 つの C プログラムを通信させる方法であり、2 つの異なる言語で 2 つの異なるプログラムを使用することはありませんでした。
まず、この stdin リダイレクトを機能させる方法はありますか? そうでない場合、Cプロセスに終了する必要があることを伝える最も簡単な解決策は何ですか?