Domanda

Quando si crea un processo figlio in C ++ utilizzando API di Windows, si può permettere l'eredità di maniglie da genitore a figlio. In un esempio "Creazione di un processo figlio con ingresso reindirizzate e uscita ", reindirizzare un processo figlio std in / out per tubi creati dalla casa madre, è necessario consentire l'eredità per i tubi di reindirizzamento per essere utilizzabili.

Sto lavorando su una piccola classe demo che lancia un eseguibile esterno, legge l'uscita, e poi sputa al chiamante (che registra l'output restituito a un file). Sto cercando di costruire in una funzione di time-out, dove bloccherà solo per un certo periodo di tempo prima di chiamare TerminateProcess() sul bambino e proseguendo con la vita.

Tuttavia, ho scoperto che, consentendo la maniglia eredità, il processo figlio ha anche una maniglia (visibile con Process Explorer ) per il file di output. Non voglio che il processo figlio per ottenere questa maniglia, ma il genitore in questo caso (questa classe demo) non è a conoscenza del manico sia, quindi non posso attualmente utilizzare SetHandleInformation() per rimuovere il contrassegno del file di output specificamente per escluderla dalla eredità.

Sono certo ci deve essere un modo migliore per ereditare la solo le maniglie specifici che voglio, senza consentire l'ereditarietà "coperta" che passa maniglie indesiderate e indesiderate. Purtroppo sono stato in grado di trovare una soluzione, dopo aver passato in rassegna come molti articoli MSDN correlate, come posso trovare, ed avendo io stesso su Google in uno stato di scoraggiamento.

Per lo meno, ho bisogno di fare qualcosa per rimuovere le maniglie dal bambino, senza dover necessariamente quelle maniglie all'interno della classe demo (sono utilizzati dalla classe di chiamata, e questa demo classe non è a conoscenza esplicita della loro esistenza).

Tutte le soluzioni per l'eredità più selettivo? Sono particolarmente interessato alla soluzione che mi permette di dichiarare specificamente che cosa si occupa di ereditare, e tutte le maniglie non-specificato non viene ereditato, se esiste una tale soluzione.

Grazie di cuore.

È stato utile?

Soluzione

Se l'handle di file di output viene ereditato dal processo figlio, che poi è perché il codice nel processo genitore ha aperto il file ha dichiarato esplicitamente che l'handle di file dovrebbe essere ereditabile. E 'passato un valore per il parametro lpSecurityAttributes di CreateFile . Lo stato di default è per la maniglia per non essere ereditabile.

Mi sembra che la classe processo di creazione non dovrebbe cercare di indovinare il suo interlocutore, che ha già aperto il file.

Tuttavia, se si dispone di conoscenze specifiche di esattamente che gestisce le nuove esigenze di processo, poi come di Windows Vista, c'è un meccanismo per specificare che le maniglie dovrebbero essere ereditate. Quando si prepara a chiamare CreateProcess, utilizzare una struttura STARTUPINFOEX invece del solito STARTUPINFO. Ha un membro lpAttributeList. Allocare e inizializzare esso, e quindi utilizzare UpdateProcThreadAttribute con PROC_THREAD_ATTRIBUTE_HANDLE_LIST per impostare l'elenco delle maniglie per essere ereditata. Tutte le maniglie devono essere ereditabile, e hai ancora bisogno di specificare bInheritHandles = true quando si chiama CreateProcess. È inoltre necessario includere EXTENDED_STARTUPINFO_PRESENT nel parametro dwCreationFlags. Raymond Chen ha dimostrato la tecnica in un articolo del 2011.

Se tale funzionalità aggiunto non è a disposizione di voi, allora si potrebbe certamente provare a [elencare tutti gli handle aperti del vostro programma] e impostare tutte le loro proprietà di ereditarietà con SetHandleInformation , ma che sembra essere al di là della portata di una funzione il cui compito è quello di creare processi figli. Lasciate che il codice che crea le maniglie preoccuparsi se essi dovrebbero essere ereditabile.

Altri suggerimenti

È possibile utilizzare SetHandleInformation per cancellare il bit HANDLE_FLAG_INHERIT sul manico di uscita, per evitare che il processo figlio di ereditare esso.

  

Se è impostato questo flag, un processo figlio creato con il parametro bInheritHandles di CreateProcess impostato su TRUE erediterà la maniglia oggetto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top