我在这里尝试进行小型单元测试。但该计划并没有像我预期的那样发挥作用。
char *args[2];
args[0] = (char*)"/usr/bin/firefox";
args[1] = NULL;
pid = fork();
printf("forked and my pid is %d\n",pid);
//check for errors
if (pid<0){
printf("Error: invoking fork to start ss has failed, Exiting\n ");
exit(1);
}
//the child process runs firefox
if (pid==0){
if (execv(args[0],args)<0){
perror("Error: running s with execvp has failed, Exiting\n");
}
printf("IVE BEEN KILLED\n");
}
//dad is here
printf("DAD IS GOING TO KILL U\n");
if (pid>0){
sleep(3);
kill(get_pidof(string("firefox")),SIGUSR1);
}
现在,我希望程序运行如下: 1.孩子运行firefox(它确实如此) 爸爸打印爸爸去杀人(到目前为止一切都好) 3. Firefox将打开3秒然后关闭(也是这样) 4.孩子的过程将完成运行execv并打印&#34; IVE BEEN KILLED&#34;。这不会发生。
我的目标是知道execv运行的程序已经通过在execv继续运行之后立即引发一些标志来完成(其中我已被杀死了printf)。 我有几千行代码,除非必要,否则不想使用其他方法。
由于
答案 0 :(得分:2)
execv()
用新流程替换当前流程。当 firefox 通过execv()
启动时,printf("IVE BEEN KILLED\n")
基本上不再存在,并且永远不会执行(请参阅man execv)。父进程有可能等待子进程 firefox ,使用wait()退出,或者通过信号警告子进程死亡(例如{{ 1}})。
答案 1 :(得分:0)
你已经杀死了这个孩子,但它并没有抓住这个信号,所以它就死了。至少如果exec返回它会,但它没有。因此,如果执行失败,您只能执行打印。
如果您想知道您的孩子是否已经完成,请使用wait
电话。
另请注意,由于您的孩子没有退出,它会执行父pid的代码,这可能很有趣。