aprire /dev/null con O_WRONLY, quindi dup2 per chiudere il descrittore di file offensivo e riutilizzare il suo descrittore per /dev/null. In questo modo qualsiasi lettura o scrittura sul descrittore di file fallirà.
Se duplichi un descrittore in /dev/null
, qualsiasi scrittura non fallirà , ma riuscito e le letture avranno successo e restituisce 0 (eof).
Questo può o non può essere quello che vuoi.
Su Linux, puoi anche aprire un file con flags =3 (O_WRONLY|O_RDWR
noto anche come O_NOACCESS
) che causerà il fallimento di qualsiasi lettura o scrittura con EBADF
.
Il file sarà disponibile solo per ioctls, il che fa emergere un pericolo di cui non si parla nell'altra risposta e nei commenti:le letture e le scritture non sono le uniche operazioni eseguite sui descrittori di file. (che dire di lseek
o ftruncate
?).
Aggiornamento:
Ho trovato qualcosa di meglio del O_WRONLY|O_RDWR
non documentato :O_PATH = 010000000 / 0x200000
. Secondo la manpage 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.).