diff options
| author | bors <bors@rust-lang.org> | 2022-09-02 21:08:08 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2022-09-02 21:08:08 +0000 |
| commit | 8c6ce6b91b172f77c795a74bfeaf74b865146b3f (patch) | |
| tree | 5e620d34e0d80a748c87d4daddf1e73a15c39e80 /src/test/ui/attributes/unix_sigpipe/unix_sigpipe-start.rs | |
| parent | 9ba169a73acfa9c9875b76eec09e9a91cc6246df (diff) | |
| parent | 3810d4a3680d825448f5034262cc6ad63586b02e (diff) | |
| download | rust-8c6ce6b91b172f77c795a74bfeaf74b865146b3f.tar.gz rust-8c6ce6b91b172f77c795a74bfeaf74b865146b3f.zip | |
Auto merge of #97802 - Enselic:add-no_ignore_sigkill-feature, r=joshtriplett
Support `#[unix_sigpipe = "inherit|sig_dfl"]` on `fn main()` to prevent ignoring `SIGPIPE`
When enabled, programs don't have to explicitly handle `ErrorKind::BrokenPipe` any longer. Currently, the program
```rust
fn main() { loop { println!("hello world"); } }
```
will print an error if used with a short-lived pipe, e.g.
% ./main | head -n 1
hello world
thread 'main' panicked at 'failed printing to stdout: Broken pipe (os error 32)', library/std/src/io/stdio.rs:1016:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
by enabling `#[unix_sigpipe = "sig_dfl"]` like this
```rust
#![feature(unix_sigpipe)]
#[unix_sigpipe = "sig_dfl"]
fn main() { loop { println!("hello world"); } }
```
there is no error, because `SIGPIPE` will not be ignored and thus the program will be killed appropriately:
% ./main | head -n 1
hello world
The current libstd behaviour of ignoring `SIGPIPE` before `fn main()` can be explicitly requested by using `#[unix_sigpipe = "sig_ign"]`.
With `#[unix_sigpipe = "inherit"]`, no change at all is made to `SIGPIPE`, which typically means the behaviour will be the same as `#[unix_sigpipe = "sig_dfl"]`.
See https://github.com/rust-lang/rust/issues/62569 and referenced issues for discussions regarding the `SIGPIPE` problem itself
See the [this](https://rust-lang.zulipchat.com/#narrow/stream/219381-t-libs/topic/Proposal.3A.20First.20step.20towards.20solving.20the.20SIGPIPE.20problem) Zulip topic for more discussions, including about this PR.
Tracking issue: https://github.com/rust-lang/rust/issues/97889
Diffstat (limited to 'src/test/ui/attributes/unix_sigpipe/unix_sigpipe-start.rs')
| -rw-r--r-- | src/test/ui/attributes/unix_sigpipe/unix_sigpipe-start.rs | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/src/test/ui/attributes/unix_sigpipe/unix_sigpipe-start.rs b/src/test/ui/attributes/unix_sigpipe/unix_sigpipe-start.rs new file mode 100644 index 00000000000..64fd5ec4f0e --- /dev/null +++ b/src/test/ui/attributes/unix_sigpipe/unix_sigpipe-start.rs @@ -0,0 +1,6 @@ +#![feature(start)] +#![feature(unix_sigpipe)] + +#[start] +#[unix_sigpipe = "inherit"] //~ error: `unix_sigpipe` attribute can only be used on `fn main()` +fn custom_start(argc: isize, argv: *const *const u8) -> isize { 0 } |
