Хорошо, у меня есть программа, написанная на c #, которая запускает процесс, выполняющий другую программу, написанную на C. Теперь я уже разработал перенаправление stdout из программы C и поднял его на стороне C #, и это прекрасно работает Но мне нужен способ, чтобы программа на C # сказала программе на C завершиться. Сначала я подумал, что, поскольку программа на C изначально контролировалась посредством тестирования kbhit из conio.h, я мог просто перенаправить stdin и выполнить потоковую запись чего-либо, и это обнаружило бы нажатие клавиши, но это не сработало (я предполагаю, что kbhit не поддается перенаправлению), поэтому я искал вокруг, и многие люди продолжали предлагать PeekConsoleInput (), потому что я пишу эту программу исключительно для Windows (на самом деле для конкретной машины). Поэтому я изменил программу на c, чтобы использовать PeekConsoleInput вместо kbhit и перенаправить стандартный ввод, и он все еще не обнаружил ничего, что я ему отправил. Например, в 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 самостоятельно, это было бы не так плохо.
Одна вещь, которую я попробовал, это сработало: программа C # просто записывала файл, а программа C просто опрашивала fopen до тех пор, пока она успешно не открывала его, но одна из основных целей этой программы C - писать в данные на диск очень быстрые, и я беспокоюсь, что опрос диска может замедлить его работу.
Еще одна вещь, которая вроде как работала, это просто закрытие процесса. Но это грязно, потому что программе на C нужно очистить некоторые вещи перед закрытием (если только нет способа заставить программу на C выполнить некоторый код, прежде чем она закроется, но я не уверен, что вы можете это сделать).
Другими способами сделать это были бы сокеты, каналы и т. Д., Но кажется, что для однобитового сигнала требуется много работы. Кроме того, все примеры, которые я мог найти о том, как это сделать, казалось, все, как заставить две программы на C # общаться или как заставить общаться две программы на C, никогда не две разные программы на двух разных языках.
Итак, во-первых, есть ли способ заставить работать перенаправление stdin? и если нет, то как проще всего сообщить процессу C, что ему нужно выйти?