微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

等待主要的execvp

int main() { ... if(!fork()) { execvp(cmdName,cmdParam); } printf("In main()..."); return(0); }

假设我已经正确传递了cmdName&cmdParam参数,那么在恢复main()的执行之前,如何等待由execvp创build的进程完成?

execvp()是否创build了一个新的fork()进程的subprocess?

如何确定Linux进程启动的date和时间?

mmap系统调用返回-14(-EFAULT ??)

如何检查一个文件是否被另一个应用程序在C ++中打开?

你能解释这个C代码吗? (创build一个deamon程序)

在Linux上维护长期运行的任务

在父进程中, fork返回子进程的PID,因此可以将其存储在一个变量中,然后使用waitpid来等待子进程终止。

不是真的 – 由fork创建的新子进程是父进程的复制,然后execvp用新映像替换其进程映像。 实际上,你最初有两个“副本”的父母,其中之一,然后“成为”新的程序。

对于你的第一个问题:

使用waitpid(2)像这样:

int pid = fork(); if (!pid) { execvp(cmdName,cmdParam); } waitpid(pid,NULL,0); printf("Resuming main()...n");

对于第二部分:所有的exec函数调用都将结束(不返回)

如上所述,您需要保存分叉调用的值。 你应该在叉子上使用更多的if。 有三种情况:

0:你是孩子的过程

0:你是父母,并有一个孩子PID回来

-1:发生了一些可怕的事情,叉子失败了

你真的想知道案件3,它会毁了你的一整天。 (也是执行电话)

int main() { int pid = fork(); if(-1 == pid) { fprintf(stderr,"Big problems forking %sn",strerror(errno); exit(-1);//or whatever } else if (0 == pid) { if (-1 == execvp(cmdName,cmdParam)) { //like above,get some output about what happened } } //no need to else here,execvp shouldn't return // if it does you've taken care of it above waitpid(pid,0); printf("Resuming main()..."); }

返回(0); }

您需要存储fork()的返回值,这会向每个可执行文件返回一个不同的值(如果您是父级,则为0),然后您需要执行waitpid

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐