if (!(flag & F_NOWAIT)) {
/* wait for the child to exit */
do {
- } while (waitpid(p, &status, 0) == -1);
+ /* Exit if parent has exited */
+ if (getppid() == 1) {
+ /* Kill child */
+ kill(p, SIGKILL);
+
+ /* Exit */
+ _exit(0);
+ }
+ } while (waitpid(p, &status, WNOHANG) <= 0);
if (WIFEXITED(status)) {
status = WEXITSTATUS(status);
exitcurses();
pid = xfork(flag);
+
+ /* Child */
if (pid == 0) {
if (dir && chdir(dir) == -1)
_exit(1);
execvp(*argv, argv);
_exit(1);
- } else {
- retstatus = join(pid, flag);
+ }
- DPRINTF_D(pid);
- if (flag & F_NORMAL) {
- nonl();
- noecho();
- }
+ /* Parent */
+ retstatus = join(pid, flag);
- free(cmd);
+ DPRINTF_D(pid);
+ if (flag & F_NORMAL) {
+ nonl();
+ noecho();
}
+ free(cmd);
+
return retstatus;
}