2

这是我的代码的细分。

我有一个程序可以分叉一个孩子(并在文件中注册孩子的 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

4 回答 4

4

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

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

于 2011-03-02T19:23:05.240 回答
3

execv用新进程替换当前进程。为了产生一个新进程,您可以使用例如system()popen()或 和 的fork()组合exec()

于 2011-03-02T19:22:06.753 回答
1

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

在孩子跑步时父母不应该做任何事情的简单情况下,只需使用andsystem代替。forkexec

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

  • 当孩子退出时,父母将获得SIGCHLD. 的默认处理程序SIGCHLD是忽略。如果您想捕获该信号,请在调用之前安装一个处理程序fork
  • 孩子退出后,父母应该打电话waitpid清理孩子并找出它的退出状态。
  • 父母也可以调用waitwaitpid以阻塞模式等待孩子退出。
  • 父母也可以waitpid在非阻塞模式下调用以查明孩子是否已经退出。
于 2011-03-02T19:39:31.237 回答
0

你期望会发生什么?这就是这样execv做的。请阅读文档,其中说:

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

也许你在追求system什么,要求环境在当前进程之外产生一个新进程。或者..这不是你已经取得的成就fork吗?在这里很难看出你想要完成什么。

于 2011-03-02T19:26:01.650 回答