这是我的代码的 segmentation 。
我有一个程序可以 fork 一个 child (并在一个文件中注册 child 的 pid),然后做它自己的事情。 child 成为程序员用 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 成功启动并完成(return 0 之前的 printf 语句让我知道),我没有看到正在执行的 switch 语句中的其余命令。我想知道 execv 中是否有一个 ^C 命令,它会在它完成时杀死 child ,从而永远不会完成其余的命令。我查看了手册页,但没有发现任何关于该主题的有用信息。
谢谢!
最佳答案
execv
用不同的程序替换当前正在执行的程序。一旦新程序完成,它不会恢复旧程序,因此它被记录为“成功时,execv 不返回”。
因此,当且仅当 execv
失败时,您应该看到消息“完成执行”。
关于c - C execve() 函数是否终止子进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5172257/