mirror of
https://github.com/fish-shell/fish-shell.git
synced 2025-01-19 20:22:45 +08:00
Retry setpgid in setup_child_process on EPERM
This commit is contained in:
parent
1ae0272c4e
commit
d6c4e66484
|
@ -935,11 +935,10 @@ void exec_job(parser_t &parser, job_t *j) {
|
|||
// output, so that we can truncate the file. Does not apply to /dev/null.
|
||||
bool must_fork = redirection_is_to_real_file(stdout_io.get()) ||
|
||||
redirection_is_to_real_file(stderr_io.get());
|
||||
if (!must_fork) {
|
||||
//we are handling reads directly in the main loop. Make sure source is unblocked.
|
||||
unblock_previous();
|
||||
}
|
||||
if (!must_fork && p->is_last_in_job) {
|
||||
//we are handling reads directly in the main loop. Make sure source is unblocked.
|
||||
//Note that we may still end up forking.
|
||||
unblock_previous();
|
||||
const bool stdout_is_to_buffer = stdout_io && stdout_io->io_mode == IO_BUFFER;
|
||||
const bool no_stdout_output = stdout_buffer.empty();
|
||||
const bool no_stderr_output = stderr_buffer.empty();
|
||||
|
|
|
@ -78,7 +78,13 @@ bool child_set_group(job_t *j, process_t *p) {
|
|||
if (j->pgid == -2) {
|
||||
j->pgid = p->pid;
|
||||
}
|
||||
//retry on EPERM because there's no way that a child cannot join an existing progress group
|
||||
//because we are SIGSTOPing the previous job in the chain. Sometimes we have to try a few
|
||||
//times to get the kernel to see the new group. (Linux 4.4.0)
|
||||
int failure = setpgid(p->pid, j->pgid);
|
||||
while (failure == -1 && errno == EPERM) {
|
||||
debug_safe(2, "Retrying setpgid in child process");
|
||||
}
|
||||
// TODO: Figure out why we're testing whether the pgid is correct after attempting to
|
||||
// set it failed. This was added in commit 4e912ef8 from 2012-02-27.
|
||||
failure = failure && getpgid(p->pid) != j->pgid;
|
||||
|
|
Loading…
Reference in New Issue
Block a user