mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-22 23:50:19 +00:00
Shell: Check the exit status of all spawned child processes.
This commit is contained in:
parent
e4cfa9a686
commit
036d808e96
Notes:
sideshowbarker
2024-07-19 13:43:43 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/036d808e96d
1 changed files with 19 additions and 19 deletions
|
@ -424,37 +424,37 @@ static int run_command(const String& cmd)
|
|||
|
||||
|
||||
int wstatus = 0;
|
||||
int rc;
|
||||
int return_value = 0;
|
||||
|
||||
for (auto& child : children) {
|
||||
for (int i = 0; i < children.size(); ++i) {
|
||||
auto& child = children[i];
|
||||
do {
|
||||
rc = waitpid(child, &wstatus, 0);
|
||||
int rc = waitpid(child, &wstatus, 0);
|
||||
if (rc < 0 && errno != EINTR) {
|
||||
perror("waitpid");
|
||||
if (errno != ECHILD)
|
||||
perror("waitpid");
|
||||
break;
|
||||
}
|
||||
if (WIFEXITED(wstatus)) {
|
||||
if (WEXITSTATUS(wstatus) != 0)
|
||||
printf("Shell: Child %d exited with status %d\n", child, WEXITSTATUS(wstatus));
|
||||
if (i == 0)
|
||||
return_value = WEXITSTATUS(wstatus);
|
||||
} else {
|
||||
if (WIFSIGNALED(wstatus)) {
|
||||
printf("Shell: Child %d exited due to signal '%s'\n", child, strsignal(WTERMSIG(wstatus)));
|
||||
} else {
|
||||
printf("Shell: Child %d exited abnormally\n", child);
|
||||
}
|
||||
}
|
||||
} while(errno == EINTR);
|
||||
}
|
||||
|
||||
// FIXME: Should I really have to tcsetpgrp() after my child has exited?
|
||||
// Is the terminal controlling pgrp really still the PGID of the dead process?
|
||||
tcsetpgrp(0, getpid());
|
||||
|
||||
tcsetattr(0, TCSANOW, &trm);
|
||||
|
||||
if (WIFEXITED(wstatus)) {
|
||||
if (WEXITSTATUS(wstatus) != 0)
|
||||
printf("Exited with status %d\n", WEXITSTATUS(wstatus));
|
||||
return WEXITSTATUS(wstatus);
|
||||
} else {
|
||||
if (WIFSIGNALED(wstatus)) {
|
||||
puts(strsignal(WTERMSIG(wstatus)));
|
||||
} else {
|
||||
printf("Exited abnormally\n");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
return return_value;
|
||||
}
|
||||
|
||||
int main(int argc, char** argv)
|
||||
|
|
Loading…
Reference in a new issue