Descripteur de fichier incorrect rencontré lors de la tentative d'ajout de fichier
Lorsque vous essayez d'ajouter un fichier de journalisation dans une routine Go, vous pouvez rencontrer l'erreur "écrire ./log.log : mauvais descripteur de fichier". Malgré l'existence du fichier et les autorisations appropriées (666), ce problème persiste.
Initialement, la cause était soupçonnée d'être un accès simultané au fichier par plusieurs routines go. Cependant, l'implémentation d'un mutex n'a pas réussi à résoudre le problème.
Solution
La résolution réside dans l'ajout de l'indicateur O_WRONLY lors de l'ouverture du fichier :
if f, err := os.OpenFile("./log.log", os.O_APPEND|os.O_WRONLY, os.ModeAppend); err != nil { /*[...]*/ }
Explication
Selon la documentation Linux pour open, l'un des trois modes d'accès (O_RDONLY, O_WRONLY ou O_RDWR) doit être spécifié. Ces modes demandent respectivement l'ouverture du fichier en lecture seule, en écriture seule ou en lecture/écriture.
Par défaut, le descripteur de fichier est ouvert en mode lecture seule, comme le confirme le code suivant dans / usr/local/go/src/syscall/zerrors_linux_amd64.go:
O_RDONLY = 0x0 O_RDWR = 0x2 O_WRONLY = 0x1
Par conséquent, spécifier explicitement O_WRONLY garantit que le fichier est ouvert en mode écriture seule, résolvant le problème initial.
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!