wait4pid: if passed with pid < 0, do not set errno - it is already set by exec!

This commit is contained in:
Denis Vlasenko 2007-04-09 13:21:33 +00:00
parent 7e754f12d3
commit 53d445aa75
2 changed files with 33 additions and 34 deletions

View File

@ -61,11 +61,43 @@ pid_t spawn(char **argv)
pid_t xspawn(char **argv) pid_t xspawn(char **argv)
{ {
pid_t pid = spawn(argv); pid_t pid = spawn(argv);
if (pid < 0) bb_perror_msg_and_die("%s", *argv); if (pid < 0)
bb_perror_msg_and_die("%s", *argv);
return pid; return pid;
} }
// Wait for the specified child PID to exit, returning child's error return.
int wait4pid(int pid)
{
int status;
if (pid <= 0) {
/*errno = ECHILD; -- wrong. we expect errno to be set from failed exec */
return -1;
}
if (waitpid(pid, &status, 0) == -1)
return -1;
if (WIFEXITED(status))
return WEXITSTATUS(status);
if (WIFSIGNALED(status))
return WTERMSIG(status) + 10000;
return 0;
}
int wait_nohang(int *wstat)
{
return waitpid(-1, wstat, WNOHANG);
}
int wait_pid(int *wstat, int pid)
{
int r;
do
r = waitpid(pid, wstat, 0);
while ((r == -1) && (errno == EINTR));
return r;
}
#if 0 //ndef BB_NOMMU #if 0 //ndef BB_NOMMU
// Die with an error message if we can't daemonize. // Die with an error message if we can't daemonize.

View File

@ -193,39 +193,6 @@ void xfflush_stdout(void)
} }
} }
// Wait for the specified child PID to exit, returning child's error return.
int wait4pid(int pid)
{
int status;
if (pid <= 0) {
errno = ECHILD;
return -1;
}
if (waitpid(pid, &status, 0) == -1)
return -1;
if (WIFEXITED(status))
return WEXITSTATUS(status);
if (WIFSIGNALED(status))
return WTERMSIG(status) + 10000;
return 0;
}
int wait_nohang(int *wstat)
{
return waitpid(-1, wstat, WNOHANG);
}
int wait_pid(int *wstat, int pid)
{
int r;
do
r = waitpid(pid, wstat, 0);
while ((r == -1) && (errno == EINTR));
return r;
}
void sig_block(int sig) void sig_block(int sig)
{ {
sigset_t ss; sigset_t ss;