c – Linux,waitpid,WNOHANG和僵尸

c – Linux,waitpid,WNOHANG和僵尸,第1张

概述我需要能够: > fork一个进程并使其成为execvp(我做到了) >检查子进程execvp是否成功(不知道如何) >检查子进程是否完成(有问题) 我正在寻求一个过程,我没有办法检查孩子的execvp是否有效.如果失败了,我需要知道它失败了.目前我正在使用 -1 != waitpid( pid, &status, WNOHANG ) 但似乎如果pid进程的execv失败,waitpid不会返回- 我需要能够:

> fork一个进程并使其成为execvp(我做到了)
>检查子进程execvp是否成功(不知道如何)
>检查子进程是否完成(有问题)

我正在寻求一个过程,我没有办法检查孩子的execvp是否有效.如果失败了,我需要知道它失败了.目前我正在使用

-1 != waitpID( pID,&status,WNOHANG )

但似乎如果pID进程的execv失败,waitpID不会返回-1.

我该怎么检查?我读了waitpID手册页,但我不清楚;也许我的英语不够好.

编辑:为了解释更多:
我正在为家庭作业建立自己的终端.我需要输入一个命令字符串,让我们说“ls”,然后我必须执行命令.
在子forks之后,子进程调用execvp来执行命令(在我解析字符串之后),并且父进程需要检查是否有’&’在命令的最后是否.
如果标志’&’在命令结束时不存在,那么父进程需要等待子进程执行.

所以我需要知道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.

总结

以上是内存溢出为你收集整理的c – Linux,waitpid,WNOHANG和僵尸全部内容,希望文章能够帮你解决c – Linux,waitpid,WNOHANG和僵尸所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1257271.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存