You've already forked uutils.github.io
mirror of
https://github.com/uutils/uutils.github.io.git
synced 2026-06-10 16:12:28 -07:00
deploy: f0e8d44e6e
This commit is contained in:
+1
-1
File diff suppressed because one or more lines are too long
@@ -372,6 +372,21 @@
|
||||
<a href="#372" id="372">372</a>
|
||||
<a href="#373" id="373">373</a>
|
||||
<a href="#374" id="374">374</a>
|
||||
<a href="#375" id="375">375</a>
|
||||
<a href="#376" id="376">376</a>
|
||||
<a href="#377" id="377">377</a>
|
||||
<a href="#378" id="378">378</a>
|
||||
<a href="#379" id="379">379</a>
|
||||
<a href="#380" id="380">380</a>
|
||||
<a href="#381" id="381">381</a>
|
||||
<a href="#382" id="382">382</a>
|
||||
<a href="#383" id="383">383</a>
|
||||
<a href="#384" id="384">384</a>
|
||||
<a href="#385" id="385">385</a>
|
||||
<a href="#386" id="386">386</a>
|
||||
<a href="#387" id="387">387</a>
|
||||
<a href="#388" id="388">388</a>
|
||||
<a href="#389" id="389">389</a>
|
||||
</pre><pre class="rust"><code><span class="comment">// * This file is part of the uutils coreutils package.
|
||||
// *
|
||||
// * (c) Alex Lyon <arcterus@mail.com>
|
||||
@@ -570,6 +585,22 @@
|
||||
}
|
||||
}
|
||||
|
||||
<span class="kw">fn </span>send_signal(process: <span class="kw-2">&mut </span>Child, signal: usize, foreground: bool) {
|
||||
<span class="comment">// NOTE: GNU timeout doesn't check for errors of signal.
|
||||
// The subprocess might have exited just after the timeout.
|
||||
// Sending a signal now would return "No such process", but we should still try to kill the children.
|
||||
</span><span class="kw">_ </span>= process.send_signal(signal);
|
||||
<span class="kw">if </span>!foreground {
|
||||
<span class="kw">_ </span>= process.send_signal_group(signal);
|
||||
<span class="kw">let </span>kill_signal = signal_by_name_or_value(<span class="string">"KILL"</span>).unwrap();
|
||||
<span class="kw">let </span>continued_signal = signal_by_name_or_value(<span class="string">"CONT"</span>).unwrap();
|
||||
<span class="kw">if </span>signal != kill_signal && signal != continued_signal {
|
||||
<span class="kw">_ </span>= process.send_signal(continued_signal);
|
||||
<span class="kw">_ </span>= process.send_signal_group(continued_signal);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
<span class="doccomment">/// Wait for a child process and send a kill signal if it does not terminate.
|
||||
///
|
||||
/// This function waits for the child `process` for the time period
|
||||
@@ -591,10 +622,11 @@
|
||||
/// If there is a problem sending the `SIGKILL` signal or waiting for
|
||||
/// the process after that signal is sent.
|
||||
</span><span class="kw">fn </span>wait_or_kill_process(
|
||||
<span class="kw-2">mut </span>process: Child,
|
||||
process: <span class="kw-2">&mut </span>Child,
|
||||
cmd: <span class="kw-2">&</span>str,
|
||||
duration: Duration,
|
||||
preserve_status: bool,
|
||||
foreground: bool,
|
||||
verbose: bool,
|
||||
) -> std::io::Result<i32> {
|
||||
<span class="kw">match </span>process.wait_or_timeout(duration) {
|
||||
@@ -608,7 +640,7 @@
|
||||
<span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>) => {
|
||||
<span class="kw">let </span>signal = signal_by_name_or_value(<span class="string">"KILL"</span>).unwrap();
|
||||
report_if_verbose(signal, cmd, verbose);
|
||||
process.send_signal(signal)<span class="question-mark">?</span>;
|
||||
send_signal(process, signal, foreground);
|
||||
process.wait()<span class="question-mark">?</span>;
|
||||
<span class="prelude-val">Ok</span>(ExitStatus::SignalSent(signal).into())
|
||||
}
|
||||
@@ -674,7 +706,7 @@
|
||||
|
||||
enable_pipe_errors()<span class="question-mark">?</span>;
|
||||
|
||||
<span class="kw">let </span><span class="kw-2">mut </span>process = process::Command::new(<span class="kw-2">&</span>cmd[<span class="number">0</span>])
|
||||
<span class="kw">let </span>process = <span class="kw-2">&mut </span>process::Command::new(<span class="kw-2">&</span>cmd[<span class="number">0</span>])
|
||||
.args(<span class="kw-2">&</span>cmd[<span class="number">1</span>..])
|
||||
.stdin(Stdio::inherit())
|
||||
.stdout(Stdio::inherit())
|
||||
@@ -709,7 +741,7 @@
|
||||
.into()),
|
||||
<span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>) => {
|
||||
report_if_verbose(signal, <span class="kw-2">&</span>cmd[<span class="number">0</span>], verbose);
|
||||
process.send_signal(signal)<span class="question-mark">?</span>;
|
||||
send_signal(process, signal, foreground);
|
||||
<span class="kw">match </span>kill_after {
|
||||
<span class="prelude-val">None </span>=> {
|
||||
<span class="kw">if </span>preserve_status {
|
||||
@@ -724,6 +756,7 @@
|
||||
<span class="kw-2">&</span>cmd[<span class="number">0</span>],
|
||||
kill_after,
|
||||
preserve_status,
|
||||
foreground,
|
||||
verbose,
|
||||
) {
|
||||
<span class="prelude-val">Ok</span>(status) => <span class="prelude-val">Err</span>(status.into()),
|
||||
@@ -737,11 +770,8 @@
|
||||
}
|
||||
<span class="prelude-val">Err</span>(<span class="kw">_</span>) => {
|
||||
<span class="comment">// We're going to return ERR_EXIT_STATUS regardless of
|
||||
// whether `send_signal()` succeeds or fails, so just
|
||||
// ignore the return value.
|
||||
</span>process
|
||||
.send_signal(signal)
|
||||
.map_err(|e| USimpleError::new(ExitStatus::TimeoutFailed.into(), <span class="macro">format!</span>(<span class="string">"{e}"</span>)))<span class="question-mark">?</span>;
|
||||
// whether `send_signal()` succeeds or fails
|
||||
</span>send_signal(process, signal, foreground);
|
||||
<span class="prelude-val">Err</span>(ExitStatus::TimeoutFailed.into())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -88,6 +88,21 @@
|
||||
<a href="#88" id="88">88</a>
|
||||
<a href="#89" id="89">89</a>
|
||||
<a href="#90" id="90">90</a>
|
||||
<a href="#91" id="91">91</a>
|
||||
<a href="#92" id="92">92</a>
|
||||
<a href="#93" id="93">93</a>
|
||||
<a href="#94" id="94">94</a>
|
||||
<a href="#95" id="95">95</a>
|
||||
<a href="#96" id="96">96</a>
|
||||
<a href="#97" id="97">97</a>
|
||||
<a href="#98" id="98">98</a>
|
||||
<a href="#99" id="99">99</a>
|
||||
<a href="#100" id="100">100</a>
|
||||
<a href="#101" id="101">101</a>
|
||||
<a href="#102" id="102">102</a>
|
||||
<a href="#103" id="103">103</a>
|
||||
<a href="#104" id="104">104</a>
|
||||
<a href="#105" id="105">105</a>
|
||||
</pre><pre class="rust"><code><span class="comment">// This file is part of the uutils coreutils package.
|
||||
//
|
||||
// (c) Maciej Dziardziel <fiedzia@gmail.com>
|
||||
@@ -138,6 +153,9 @@
|
||||
/// send the signal to an unrelated process that recycled the PID.
|
||||
</span><span class="kw">fn </span>send_signal(<span class="kw-2">&mut </span><span class="self">self</span>, signal: usize) -> io::Result<()>;
|
||||
|
||||
<span class="doccomment">/// Send a signal to a process group.
|
||||
</span><span class="kw">fn </span>send_signal_group(<span class="kw-2">&mut </span><span class="self">self</span>, signal: usize) -> io::Result<()>;
|
||||
|
||||
<span class="doccomment">/// Wait for a process to finish or return after the specified duration.
|
||||
/// A `timeout` of zero disables the timeout.
|
||||
</span><span class="kw">fn </span>wait_or_timeout(<span class="kw-2">&mut </span><span class="self">self</span>, timeout: Duration) -> io::Result<<span class="prelude-ty">Option</span><ExitStatus>>;
|
||||
@@ -152,6 +170,18 @@
|
||||
}
|
||||
}
|
||||
|
||||
<span class="kw">fn </span>send_signal_group(<span class="kw-2">&mut </span><span class="self">self</span>, signal: usize) -> io::Result<()> {
|
||||
<span class="comment">// Ignore the signal, so we don't go into a signal loop.
|
||||
</span><span class="kw">if unsafe </span>{ libc::signal(signal <span class="kw">as </span>i32, libc::SIG_IGN) } != <span class="number">0 </span>{
|
||||
<span class="kw">return </span><span class="prelude-val">Err</span>(io::Error::last_os_error());
|
||||
}
|
||||
<span class="kw">if unsafe </span>{ libc::kill(<span class="number">0</span>, signal <span class="kw">as </span>i32) } != <span class="number">0 </span>{
|
||||
<span class="prelude-val">Err</span>(io::Error::last_os_error())
|
||||
} <span class="kw">else </span>{
|
||||
<span class="prelude-val">Ok</span>(())
|
||||
}
|
||||
}
|
||||
|
||||
<span class="kw">fn </span>wait_or_timeout(<span class="kw-2">&mut </span><span class="self">self</span>, timeout: Duration) -> io::Result<<span class="prelude-ty">Option</span><ExitStatus>> {
|
||||
<span class="kw">if </span>timeout == Duration::from_micros(<span class="number">0</span>) {
|
||||
<span class="kw">return </span><span class="self">self</span>.wait().map(<span class="prelude-val">Some</span>);
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user