2016-06-29 8 views
2

Hier zu haben ist ein kleines Programm, das Verhalten mit Cygwin 2.5.2 unter Windows 7.Cygwin: Aufruf zu spawnvp verursacht nicht-Konsolenprogramm ein Konsolenfenster

#include <windows.h> 
#include <process.h> 

int main(void) 
{ 
    const char * const argv[] = { 
    "c:/Windows/System32/notepad.exe", 
    0 
    }; 

    Sleep(5000); 
    return spawnvp(_P_WAIT, argv[0], argv); 
} 

Dies wird gebaut zu reproduzieren, wie folgt:

 
$ gcc -mwindows spawn.c -o spawn 

Die gute: korrekt, wird dieses Programm nicht mit einem Konsolenfenster starten. Wir können zu seinem Verzeichnis mit Windows Explorer navigieren und es starten. Nichts erscheint auf dem Bildschirm, wie das Programm beginnt mit der Ausführung und erreicht die Sleep(5000) Aussage.

Die schlechte: Nach fünf Sekunden übergeben, wird der spawnvp Aufruf ausgeführt, und das Programm bekommt ein Konsolenfenster! Der Editor wird gestartet und sein Fenster wird über diesem Konsolenfenster angezeigt.

Kann mir jemand erklären, warum und wie diese weg gehen zu lassen? Nur Notepad sollte angezeigt werden, nicht irgendein falsches Konsolenfenster.

Natürlich, wenn wir ein Konsolenprogramm spawnen, , dass Programm sollte ein eigenes Konsolenfenster bekommen. Das ist nicht das Problem hier; die Mutter wird immer das unerwünschte Fenster (und das Kind ist nicht ein Konsolenprogramm überhaupt).

Update: Ich Wiederaufbau jetzt Cygwin zu können Hoffnung, einige Debug-print-Anweisungen in die komplizierten Eingeweide hinzufügen zugrunde liegenden spawn* Funktionen, bei denen zu sehen, zeigt die Fenster erscheinen.

Antwort

1

ich verfolgen diese nach unten. Alle Cygwin spawn* und exec* Anrufe gehen durch spawne, die in winsup/cygwin/spawn.cc auf child_info_spawn::worker Elementfunktion, implementiert beruht.

Diese Funktion enthält folgende Komponenten:

if (mode == _P_DETACH) 
    c_flags |= DETACHED_PROCESS; 
    else 
    fhandler_console::need_invisible(); 

Schuld daran ist der Anruf zu diesem fhandler_console::need_invisible die eine Konsole zuordnet. Aus irgendeinem Grund denkt Cygwin, dass ein unsichtbares Konsolenfenster erstellt werden muss, wenn die aufrufende Anwendung noch keins hat. Leider werden die Pläne, dieses unsichtbare Fenster zu erstellen, nicht wie geplant umgesetzt. wir bekommen ein sichtbares Fenster.

Wenn ich diesen Anruf need_invisible kommentieren und die Cygwin DLL wieder aufzubauen, geht das Problem weg.