我在这里尝试一个小的单元测试。但是这个程序并没有像我预期的那样工作。
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 (它确实运行了)2.爸爸打印爸爸要杀死U(目前为止还好)3. firefox将打开3秒,然后关闭(也是这样)4.子进程将结束运行execv并打印"IVE BEEN KILL“。这是不会发生的。
我的目标是知道execv运行的程序是否在execv继续运行后立即引发了一些标志(我被杀死的printf所在的位置)。我有一个几千行的代码,除非有必要,否则我不想使用其他方法。
谢谢
发布于 2012-11-08 22:14:11
execv()将当前进程替换为新进程。当火狐通过execv()启动时,printf("IVE BEEN KILLED\n")实质上不再存在于进程中,并且永远不会被执行(参见man execv)。父进程可以通过使用wait()来等待子进程firefox退出,或者通过信号(例如signal(SIGCHLD, child_exit_handler))对子进程的死亡发出警报。
发布于 2012-11-08 22:15:13
你杀了孩子,它没有捕捉到信号,所以它就死了。至少在exec返回的时候是这样的,但是它没有返回,所以你只需要在exec失败的情况下执行打印。
如果您想知道您的孩子是否完成了,请使用wait调用。
还要注意,当子进程不退出时,它将执行父pid的代码,这可能很有趣。
https://stackoverflow.com/questions/13290594
复制相似问题