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

Open
zackw opened this Issue Feb 22, 2017 · 2 comments

Comments

Projects
None yet
6 participants
@zackw
Copy link
Contributor

zackw commented Feb 22, 2017

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 (and Stderr) add a close 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 use io::stdout() after calling close 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 the open() 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 and Stderr with an arbitrary instance of Write" (mentioned in #40007) should also perform this close operation.)

@nagisa

This comment has been minimized.

Copy link
Contributor

nagisa commented Feb 22, 2017

For Windows it’s Nul Device Driver and SetStdHandle AFAICT.

@dtolnay

This comment has been minimized.

Copy link
Member

dtolnay commented Nov 16, 2017

Seems reasonable to me. I would be interested in seeing an implementation of this in a PR.

zackw added a commit to zackw/rust that referenced this issue Nov 17, 2017

Partial implementation of `close` for stdin/out/err (rust-lang#40032)
This is only the low-level code required for Unix.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment