otevřete /dev/null s O_WRONLY, pak dup2 zavřete problematický deskriptor souboru a znovu použijte jeho deskriptor pro /dev/null. Tímto způsobem selže jakékoli čtení nebo zápis do deskriptoru souboru.
Pokud zkopírujete deskriptor do /dev/null
, žádný zápis neselže , ale úspěch a čtení bude úspěšné a vrátí 0 (eof).
To může nebo nemusí být to, co chcete.
V linuxu můžete také otevřít soubor s příznaky =3 (O_WRONLY|O_RDWR
aka O_NOACCESS
), což způsobí selhání jakéhokoli čtení nebo zápisu s EBADF
.
Soubor bude dostupný pouze pro ioctls -- což přináší nebezpečí, o kterém se v další odpovědi a komentářích nemluví:čtení a zápis nejsou jediné operace prováděné na deskriptorech souborů. (co třeba lseek
nebo ftruncate
?).
Aktualizace:
Našel jsem něco lepšího než nezdokumentovaný O_WRONLY|O_RDWR
:O_PATH = 010000000 / 0x200000
. Podle manuálové stránky 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.).