abra /dev/null con O_WRONLY, luego dup2 para cerrar el descriptor del archivo ofensivo y reutilice su descriptor para /dev/null. De esta forma, cualquier lectura o escritura en el descriptor del archivo fallará.
Si duplica un descriptor a /dev/null
, cualquier escritura no fallará , pero tener éxito , y las lecturas sucederán y devuelve 0 (eof).
Esto puede o no ser lo que quieres.
En Linux, también puede abrir un archivo con flags =3 (O_WRONLY|O_RDWR
también conocido como O_NOACCESS
) que hará que cualquier lectura o escritura falle con EBADF
.
El archivo solo estará disponible para ioctls, lo que plantea un peligro del que no se habla en la otra respuesta y comentarios:las lecturas y escrituras no son las únicas operaciones realizadas en los descriptores de archivos. (¿Qué pasa con lseek
o ftruncate
?).
Actualización:
Encontré algo mejor que el O_WRONLY|O_RDWR
indocumentado :O_PATH = 010000000 / 0x200000
. Según la página de manual de 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.).