GoldenCrystal (./3907) :
Un processus enfant peut parfaitement hériter des handles de son papa.
Voir la page de MSDN sur le sujet pour ceux qui ne sont pas au courant C'est très souple comme système, faut pas croire.
Sauf que… sauf que… les sockets ne sont pas héritables. C'est écrit dans la documentation en toutes lettres.
C'est même écrit d'une manière très amusante. Je cite :
You should not use DuplicateHandle to duplicate handles to the following objects:
— I/O completion ports. No error is returned, but the duplicate handle cannot be used.
— Sockets. No error is returned, but the duplicate handle may not be recognized by Winsock at the target process. Also, using DuplicateHandle interferes with internal reference counting on the underlying object.
WTF?!!!?
Donc la fonction ne retourne pas d'erreur, mais n'a pas fait son boulot. Pire, elle risque de provoquer une fuite de ressources dans les libs systèmes. Are you f*cking kidding me?
Enfin bref, tout ça pour dire que non, on ne peut pas utiliser createprocess pour partager un socket. Mais il y a même un truc encore plus rigolo :
bien que non héritables, ils sont parfois hérités quand même, même s'ils ont été marqués NON héritables.
(à cas où tu te poserais la question l'usage de SetHandleInformation au lieu de DuplicateHandle arrive au même résultat : des fois ça marche, des fois ça marche pas. C'est logique quelque part vu que c'est le même mécanisme sous-jacent. Sauf que pour SetHandleInformation c'est même pas écrit dans la doc qu'il ne faut pas l'utiliser sur des sockets — et WSADuplicateSocket ne permet pas de changer l'attribut inheritable).
Tu vois le souci des apis w32, c'est que dès que tu fais quoi que ce soit, tu te manges ce genre de trucs. Comportement incohérent (on peut dupliquer certains handles mais pas tous, c'est quoi l'intérêt de l'abstraction en handles alors), voire comportement aléatoire. T'apprends à naviguer autour, mais l'ensemble est très inconsistant, ce qui fait perdre du temps (il faut toujours vérifier chaque ligne de la doc à chaque fois que tu fais quelque chose), et fait faire des erreurs. La preuve, jusqu'à il y a 2 minutes, bien que tu sois un développeur aguéri, tu pensais pouvoir hériter n'importe quel handle.