C execve()函数是否终止子进程?

时间:2011-03-02 19:19:02

标签: c fork switch-statement execv

下面是我的代码细分。

我有一个程序,它会分叉一个孩子(并将孩子的pid注册到一个文件中),然后做自己的事情。孩子成为程序员用argv尊严的任何程序。当子进程执行完毕后,它会向父进程发送一个信号(使用SIGUSR1),以便父进程知道从文件中删除子进程。父节点应该停止一秒,通过更新其表来确认删除的条目,并从中断处继续。

pid = fork();
switch(pid){
case -1:{
    exit(1);
}

case 0 :{
    (*table[numP-1]).pid = getpid(); //Global that stores pids
    add();                             //saves table into a text file 
    freeT(table);                  //Frees table 
    execv(argv[3], &argv[4]);          //Executes new program with argv 
    printf("finished execution\n");  
    del(getpid());                     //Erases pid from file 
    refreshReq();                      //Sends SIGUSR1 to parent
    return 0;
}
default:{
    ... //Does its own thing
}
}

问题是after execv成功启动并完成(返回0之前的printf语句让我知道),我没有看到switch语句中的其余命令正在执行。我想知道execv是否在其中有一个^ C命令,它在完成时杀死了孩子,因此永远不会完成其余的命令。我查看了手册页,但没有找到任何有用的主题。

谢谢!

4 个答案:

答案 0 :(得分:4)

execv用不同的程序替换当前正在执行的程序。新程序完成后它不会恢复旧程序,因此它记录为“成功,execv不返回”。

因此,当且仅当execv失败时,您应该看到您的消息“已完成执行”。

答案 1 :(得分:2)

execv 用新的替换当前进程。为了产生新的过程,你可以使用例如system()popen()fork()exec()

的组合

答案 2 :(得分:1)

其他人已经解释了execv和类似函数的作用,以及为什么下一行代码永远不会被执行。合乎逻辑的下一个问题是,那么父母应该如何检测到孩子已经完成了?

在孩子运行时父母应该绝对不做任何事情的简单情况下,只需使用system代替forkexec

或者如果父母在孩子退出之前会做其他事情,这些是关键点:

  • 当孩子退出时,父母将获得SIGCHLDSIGCHLD的默认处理程序是ignore。如果要捕获该信号,请在调用fork之前安装处理程序。
  • 孩子退出后,家长应致电waitpid清理孩子并找出退出状态。
  • 父母也可以在阻止模式下呼叫waitwaitpid,等待孩子退出。
  • 父母也可以在非阻止模式下调用waitpid,以确定孩子是否已退出。

答案 3 :(得分:0)

您期望发生什么?这就是execv的作用。请阅读the documentation,其中写着:

  

exec()系列函数用新的过程映像替换当前过程映像。

也许你是在system之后,要求环境再生成一个新进程 到当前的进程。或者......不是你通过fork已经实现的目标吗?很难看出你想在这里完成什么。