Öffnen Sie /dev/null mit O_WRONLY, dann dup2, um den problematischen Dateideskriptor zu schließen und seinen Deskriptor für /dev/null wiederzuverwenden. Auf diese Weise schlagen alle Lese- oder Schreibvorgänge in den Dateideskriptor fehl.
Wenn Sie einen Deskriptor auf /dev/null
kopieren , alle Schreibvorgänge werden nicht fehlschlagen , aber erfolgreich , und die Lesevorgänge werden erfolgreich sein und 0 zurückgeben (eof).
Dies kann oder kann nicht das sein, was Sie wollen.
Unter Linux können Sie auch eine Datei mit flags =3 (O_WRONLY|O_RDWR
auch bekannt als O_NOACCESS
), was dazu führt, dass alle Lese- oder Schreibvorgänge mit EBADF
fehlschlagen .
Die Datei ist nur für ioctls verfügbar – was eine Gefahr aufwirft, die in den anderen Antworten und Kommentaren nicht erwähnt wurde:Lese- und Schreibvorgänge sind nicht die einzigen Operationen, die an Dateideskriptoren ausgeführt werden. (was ist mit lseek
oder ftruncate
?).
Aktualisierung:
Ich habe etwas Besseres als den undokumentierten O_WRONLY|O_RDWR
gefunden :O_PATH = 010000000 / 0x200000
. Gemäß der open(2)-Manpage:
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.).