J'essaie de définir le drapeau O_Cloexec à l'aide d'Ouvrir () et n'ayez pas de réussir.
Considérez la microtest suivante: p> Lorsque vous allumez sous Linux avec la version 2.6 du noyau Le test réussit et imprime "OK!", mais échoue avec 3,8 ou 3,9 noyaux. P> Qu'est-ce qui ne va pas?
Merci! P> p>
3 Réponses :
Le paramètre d'appel FCNTL f_getfd code>, le drapeau est
fd_cloexec code> et le support
o_cloexec code> est apparu en 2.6.
23 code> . Lire les manuels:
OP a dit qu'il réussit au noyau 2.6 mais échoue sur 3,8 / 3.9
Le test échoue lors de la course sur le noyau 3.8 qui prend évidemment en charge O_Cloexec. Veuillez lire la question.
Cette réponse est correcte dans la mesure où la droite i> moyen d'obtenir le statut cloexec code> est d'utiliser
f_getfd code> et testez pour
fd_cloexec code> , parce que
cloexec code> est un drapeau qui s'applique à chaque descripteur de fichier plutôt que le fichier ouvert sous-jacent. Cela n'explique pas pourquoi l'ABI pour
f_getfl code> apparemment changé, cependant.
Pourriez-vous s'il vous plaît citer la spécification décrivant la méthode droite i>? Des manuels, je vois que le test est parfaitement droit i>.
Non, ce n'est jamais documenté comme ça. F_GETFL code> est juste les drapeaux ouverts du fichier; quelqu'un a décidé que le bit doit être pris comme il ne touche pas le fichier ouvert, mais le descripteur de fichier uniquement. Voilà pourquoi il est pas documenté.
De plus, f_getfl semble retourner tout ce qui a été donné aux drapeaux ouverts et moins filtrés, même ignorés.
Ainsi, ce n'était jamais un moyen fiable de voir si un drapeau était soutenu.
Il a été décidé que l'exposition En d'autres termes, vous ne devriez pas avoir invoqué sur o_cloexec code> drapeau sur
fcntl (fd, f_getfl) code> est une fuite de sécurité. Modification a été apportée par ce commettre A> dans le noyau 3.6-RC7:
o_cloexec code> être visible en premier lieu. p> p >
Vous le faites mal. Vous devriez faire de cette façon:
int ret = fcntl(fd, F_GETFD); if (ret & FD_CLOEXEC) { ... }
Notez que le drapeau peut être vrai avant même avant le support O_Cloexec en 2.6.38