c – Linux,waitpid,WNOHANG和僵尸
我需要能够:
> fork一个进程并使其成为execvp(我做到了) 我正在寻求一个过程,我没有办法检查孩子的execvp是否有效.如果失败了,我需要知道它失败了.目前我正在使用 -1 != waitpid( pid,&status,WNOHANG ) 但似乎如果pid进程的execv失败,waitpid不会返回-1. 我该怎么检查?我读了waitpid手册页,但我不清楚;也许我的英语不够好. 编辑:为了解释更多: 所以我需要知道execvp是否失败了.如果它没有失败,则父使用waitpid等待子进程完成执行.如果失败,那么父母将不会等待孩子. 解决方法
#2的常见解决方案是在fork()之前打开一个管道,然后在exec之后的子代中写入它.在父母中,成功阅读意味着执行失败;不成功的读取意味着exec成功并且写入从未发生过.
// ignoring all errors except from execvp... int execpipe[2]; pipe(execpipe); fcntl(execpipe[1],F_SETFD,fcntl(execpipe[1],F_GETFD) | FD_CLOEXEC); if(fork() == 0) { close(execpipe[0]); execvp(...); // on success,never returns write(execpipe[1],&errno,sizeof(errno)); // doesn't matter what you exit with _exit(0); } else { close(execpipe[1]); int childErrno; if(read(execpipe[0],&childErrno,sizeof(childErrno)) == sizeof(childErrno)) { // exec failed,now we have the child's errno value // e.g. ENOENT } } 这使得父母可以明确地知道exec是否成功,并且作为副产品,如果不成功则是errno值. 如果exec成功,子进程可能仍然失败并带有退出代码,并且使用WEXITSTATUS宏检查状态也会给出该条件. 注意:使用WNOHANG标志调用waitpid是非阻塞的,您可能需要轮询该进程,直到返回有效的pid. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |