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