2014-05-06 13 views
9

cmd_moreWie 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?"

+1

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

Antwort

2

Die einzige Möglichkeit der Umleitung der Elterneingabe, die ich gefunden habe - ist die Erstellung eines zusätzlichen Threads. Der gemeinsame Algorithmus ist:

  1. Rohr erstellen - (hPipeRead, hPipeWrite)
  2. Kindprozeß mit Standardeingabe erstellen - hPipeRead
  3. neuen Thread in geordneten Prozess erstellen, GetStdHandle(STD_INPUT_HANDLE) und schreiben Lesepuffer zu hPipeWrite lesen sofort. Der Thread ist beendet, wenn stdInput beendet ist.
  4. Geordnetes Prozess wartet zusätzlichen Faden

diese Weise in Microsoft support article beschrieben.

Verwandte Themen