mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 17:57:35 +00:00
LibC: Make waitpid
's return value more POSIX-compliant
* Always return 0 if `WNOHANG` is specified and no waitable child is found, even if `wstatus` is null. * Do not return 0 if the child is continued. Treat it the same way as all the other states. Refer to the RETURN VALUE section of the POSIX spec: https://pubs.opengroup.org/onlinepubs/9699919799/functions/wait.html
This commit is contained in:
parent
8730e56e88
commit
4796a25bbd
1 changed files with 7 additions and 8 deletions
|
@ -45,14 +45,13 @@ pid_t waitpid(pid_t waitee, int* wstatus, int options)
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
if (wstatus) {
|
if ((options & WNOHANG) && siginfo.si_pid == 0) {
|
||||||
if ((options & WNOHANG) && siginfo.si_pid == 0) {
|
// No child in a waitable state was found. All other fields
|
||||||
// No child in a waitable state was found. All other fields
|
// in siginfo are undefined
|
||||||
// in siginfo are undefined
|
return 0;
|
||||||
*wstatus = 0;
|
}
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if (wstatus) {
|
||||||
switch (siginfo.si_code) {
|
switch (siginfo.si_code) {
|
||||||
case CLD_EXITED:
|
case CLD_EXITED:
|
||||||
*wstatus = siginfo.si_status << 8;
|
*wstatus = siginfo.si_status << 8;
|
||||||
|
@ -65,7 +64,7 @@ pid_t waitpid(pid_t waitee, int* wstatus, int options)
|
||||||
break;
|
break;
|
||||||
case CLD_CONTINUED:
|
case CLD_CONTINUED:
|
||||||
*wstatus = 0xffff;
|
*wstatus = 0xffff;
|
||||||
return 0; // return 0 if running
|
break;
|
||||||
default:
|
default:
|
||||||
VERIFY_NOT_REACHED();
|
VERIFY_NOT_REACHED();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue