L'appel de setns depuis Go renvoie EINVAL pour l'espace de noms mnt
Problème :
Le code Go ne parvient pas à entrer dans l'espace de noms mnt avec l'appel setns, ce qui entraîne une erreur EINVAL. Malgré des appels identiques dans le code C, l'implémentation Go produit l'erreur cohérente.
Enquête :
Solution :
En Go, les setns doivent être exécutés dans un contexte à thread unique avant le démarrage des threads d'exécution Go. En effet, setns agit sur le thread appelant, en le joignant à l'espace de noms.
Solution alternative utilisant l'astuce du constructeur CGO :
Ajoutez la macro __attribute__((constructeur)) à une fonction C pour qu'elle s'exécute avant l'initialisation de Go. Cela permet de saisir un espace de noms avant le démarrage des threads Go, résolvant ainsi le problème.
Mise à jour :
Une conversation sur la liste de diffusion du noyau Linux confirme la restriction selon laquelle les processus multithread ne peuvent pas être réassocié à un nouvel espace de noms de montage. Cela nécessite les capacités CAP_SYS_CHROOT et CAP_SYS_ADMIN dans l'espace de noms de l'appelant et CAP_SYS_ADMIN dans l'espace de noms cible.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!