ouvrez /dev/null avec O_WRONLY, puis dup2 pour fermer le descripteur de fichier incriminé et réutilisez son descripteur pour /dev/null. De cette façon, toute lecture ou écriture dans le descripteur de fichier échouera.
Si vous dupliquez un descripteur vers /dev/null
, toute écriture n'échouera pas , mais réussit , et les lectures réussiront et retourne 0 (eof).
Cela peut ou non être ce que vous voulez.
Sous Linux, vous pouvez également ouvrir un fichier avec des drapeaux =3 (O_WRONLY|O_RDWR
alias O_NOACCESS
) qui entraînera l'échec de toute lecture ou écriture avec EBADF
.
Le fichier ne sera disponible que pour les ioctls - ce qui soulève un danger dont il n'est pas question dans les autres réponses et commentaires :les lectures et les écritures ne sont pas les seules opérations effectuées sur les descripteurs de fichiers. (qu'en est-il de lseek
ou ftruncate
?).
Mise à jour :
J'ai trouvé quelque chose de mieux que le O_WRONLY|O_RDWR
non documenté :O_PATH = 010000000 / 0x200000
. Selon la page de manuel open(2) :
O_PATH (since Linux 2.6.39) Obtain a file descriptor that can be used for two purposes: to indicate a location in the filesystem tree and to perform opera- tions that act purely at the file descriptor level. The file itself is not opened, and other file operations (e.g., read(2), write(2), fchmod(2), fchown(2), fgetxattr(2), mmap(2)) fail with the error EBADF. The following operations can be performed on the resulting file descriptor: * close(2); fchdir(2) (since Linux 3.5); fstat(2) (since Linux 3.6). * Duplicating the file descriptor (dup(2), fcntl(2) F_DUPFD, etc.).