A small Rust library that makes it easy to close all open file descriptors.
Add to your Cargo.toml
:
[dependencies]
close_fds = "0.2"
In your application:
use close_fds::close_open_fds;
fn main() {
// ...
unsafe {
close_open_fds(3, &[]);
}
// ...
}
IMPORTANT: Please read the documentation for close_open_fds()
for an explanation of why it is unsafe
.
The first argument to close_open_fds()
is the lowest file descriptor that should be closed; all file descriptors less than this will be left open. The second argument is a slice containing a list of additional file descriptors that should be left open. (Note: close_open_fds()
will be more efficient if this list is sorted, especially if it is more than a few elements long.)
close_open_fds()
always succeeds. If one method of closing the file descriptors fails, it will fall back on another.
More details, along with other helpful functions, can be found in the documentation.
close_fds
has two OS support tiers, similar to Rust's support tiers:
- Linux (glibc and musl)
- macOS
- FreeBSD
- NetBSD
- OpenBSD
- DragonflyBSD
- Solaris
- Illumos
Note: As stated in the license, close_fds
comes with no warranty.
Here is a list of the methods that the this crate will try on various platforms to improve performance when listing the open file descriptors:
- Linux
/proc/self/fd
if/proc
is mounted (very efficient)
- macOS
/dev/fd
(very efficient)
- FreeBSD
/dev/fd
if anfdescfs
appears to be mounted there (very efficient)- The
kern.proc.nfds
sysctl to get the number of open file descriptors (moderately efficient unless large numbers of file descriptors are open; not used by the "thread-safe" functions or when closing file descriptors)
- OpenBSD
getdtablecount()
to get the number of open file descriptors (moderately efficient unless large numbers of file descriptors are open; not used by the "thread-safe" functions or when closing file descriptors)
- NetBSD
/proc/self/fd
if/proc
is mounted (very efficient)fcntl(0, F_MAXFD)
to get the maximum open file descriptor (moderately efficient)
- Solaris and Illumos
/dev/fd
or/proc/self/fd
if either is available (very efficient)
When closing file descriptors, or setting the close-on-exec flag, this crate may also call closefrom()
on the BSDs and/or close_range()
on Linux 5.9+/FreeBSD 12.2+, both of which are very efficient.
If none of the methods listed above are available, it will fall back on a simple loop through every possible file descriptor number -- from minfd
to sysconf(_SC_OPEN_MAX)
. This is slow, but it will always work.
Note: The most common use case, close_open_fds(3, &[])
, is very efficient on Linux (with /proc
mounted, or on kernel 5.9+), macOS, all of the BSDs, and Solaris/Illumos.