Wie STDIN an Kind Prozess übergeben?
void WriteToPipe(void)
// Read from a file and write its contents to the pipe for the child's STDIN.
// Stop when there is no more data.
{
DWORD dwRead, dwWritten;
CHAR chBuf[BUFSIZE];
BOOL bSuccess = FALSE;
char * name = malloc(100);
fgets(name, 100, stdin);
bSuccess = WriteFile(g_hChildStd_IN_Wr, name, 10, &dwWritten, NULL);
if (!bSuccess)
ErrorExit("");
}
void ReadFromPipe(void)
// Read output from the child process's pipe for STDOUT
// and write to the parent process's pipe for STDOUT.
// Stop when there is no more data.
{
DWORD dwRead, dwWritten;
CHAR chBuf[BUFSIZE];
BOOL bSuccess = FALSE;
HANDLE hParentStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
bSuccess = ReadFile(g_hChildStd_OUT_Rd, chBuf, BUFSIZE, &dwRead, NULL);
if (!bSuccess || dwRead == 0)
return 100;
bSuccess = WriteFile(hParentStdOut, chBuf,
dwRead, &dwWritten, NULL);
if (!bSuccess)
return 101;
}
Der Haupt (nicht vollständig):
while (1)
{
Sleep(500);
ReadFromPipe();
WriteToPipe();
}
Ich versuche, die cmd als Kindprozess zu öffnen und die Eltern Eingang mit dem Kind STDIN Strom zu passieren, und als zu Drucken Sie das STDOUT des Kindes.
Wie Sie sehen können, funktioniert es zum ersten Mal, aber dann bekomme ich das "mehr?" zurück aus dem Kind-Prozess (der cmd) und dann bleibt es stecken und wartet auf die Ausgabe.
Warum bekomme ich dieses "mehr?" zurück?
Was ist das "mehr?"
Hmm, versuchen Sie, den Standardausgabe-Handle ONCE global zu erhalten. Vermeiden Sie auch Schlaf und verwenden Sie einen Mutex, so dass die Datei, die Sie als Pipe missbrauchen, wirklich sicher geschrieben ist, bevor sie gelesen/gelesen wird, bevor sie erneut geschrieben wird. Und verwende den Debugger. Es gibt irgendwie einen Bruchteil einer Antwort auf irgendeinen Befehl, den du bestanden hast, endend mit "Mehr?" Du könntest Speicherprobleme an den Grenzen haben und einige Sachen überschreiben. – icbytes