-
Notifications
You must be signed in to change notification settings - Fork 12.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Need a way to close standard output #40032
Comments
For Windows it’s Nul Device Driver and SetStdHandle AFAICT. |
Seems reasonable to me. I would be interested in seeing an implementation of this in a PR. |
This is only the low-level code required for Unix.
This seems related to #59567 (closed, "Add close method to File"), too. |
This isn't quite true. Windows doesn't use magic handle values. Instead it uses However, that second step is made much more risky because Rust allows getting the handle value from stdio. So if that handle is subsequently closed, it's a kind of "use after free" situation for anything that grabbed the handle value beforehand. The handle value could be reused for something completely different. |
It is sometimes appropriate for a program to close its standard output stream long before it's done running. For instance, I have a C program that sets up some system-wide state, waits for its parent to be done using that setup, and then tears it down again. (It's a separate program from the parent because it has to be setuid.) It notifies the parent that it's done setting up by closing its stdout, which is expected to be a pipe.
You can do this in Rust, but only by going behind the stdlib's back and calling
libc::close(1)
. I would like there to be an official way to do this, without going behind the stdlib's back. A concrete proposal:Stdout
(andStderr
) add aclose
method. These flush buffered output, close the underlying OS-level file descriptor, and then immediately reopen it on/dev/null
, taking care to ensure that the well-known fd number is retained. It remains OK to useio::stdout()
after callingclose
on it.(Reopening the OS-level file descriptor on
/dev/null
is to accommodate third-party libraries that may assume it is always safe to write to file descriptors 1 and/or 2, and/or that theopen()
primitive will never return descriptors numbered 0, 1, or 2.)(Windows doesn't exactly have "file descriptors" but it does have the concept of "standard handles" and there is a 1:1 mapping from the Unixy terms I used above to Windows equivalents.)
(For consistency, the internal method for "replacing
Stdout
andStderr
with an arbitrary instance ofWrite
" (mentioned in #40007) should also perform thisclose
operation.)The text was updated successfully, but these errors were encountered: