2009-01-13 9 views
5

Je dois créer un nouveau processus avec un flux d'erreurs standard redirigé vers un fichier. Le code à partir duquel le processus enfant est créé n'a pas de console disponible, donc il y a des cas où GetStdHandle (any) renverra 0. Le processus enfant essayera de dupliquer toutes ses poignées IO standard pour une raison quelconque (le code source pour le processus enfant n'est pas disponible) donc toutes ses poignées devraient être valides.Comment ouvrir un fichier "nul"?

donc je dois courir ce processus de la même manière qu'il est peut être exécuté à partir de la console avec:

someproc <nul >nul 2>err 

Je vois des moyens pour cela: 1. Créez deux paires de tuyaux. C'est peut-être une bonne solution, mais ce sera trop complexe pour moi. 2. Ouvrez le fichier "nul" avec l'appel de fonction CreateFile ("nul", ...). Aucun fichier n'est créé par cet appel, mais cela me semble bizarre. 3. Utilisez INVALID_HANDLE_VALUE. Cela fonctionne aussi, mais je pense qu'il peut y avoir différents problèmes avec d'autres processus fils.

Je crois qu'il existe de meilleurs moyens.

+0

Très bien! Merci d'avoir listé les possibilités. –

Répondre

6

Comme formulé à l'origine, vous avez déjà répondu à votre propre question. Pour ouvrir un fichier "nul", vous devez simplement spécifier "nul" lorsque vous appelez CreateFile. Cela n'a l'air bizarre que parce que presque personne n'utilise jamais ce nom de fichier. (Je ne le vois pas utilisé presque aussi souvent que je vois /dev/null.) Il est parfaitement valide, cependant.

Mais si vous avez trouvé que Invalid_Handle_Value fonctionne aussi, alors allez-y et utilisez-le à la place. C'est certainement le plus facile. Au départ, je ne m'attendrais pas à ce que cela fonctionne, car je ne m'attendrais pas à ce qu'il soit duplicable.

2

Oui, "nul" fait ce que vous pensez. Si vous passez à unix, ce sera "/ dev/null". Le nom est branché un vestige de jours DOS, ainsi que « Prn » et « com1 », etc.

1

L'utilisation INVALID_HANDLE_VALUE avec DuplicateHandle est incorrect: la documentation indique que vous avez besoin d'accéder PROCESS_DUP_HANDLE à droite sur la poignée. Vous n'avez pas ce droit sur INVALID_HANDLE_VALUE. Le périphérique NUL (lien symbolique vers /device/null) fonctionnera bien, cependant.

Questions connexes