fork()kill()和execv()

我在这里尝试一个小unit testing。 但该计划并不像我预期的那样有效。

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){ sleep(3); kill(get_pidof(string("firefox")),SIGUSR1); } 

现在,我希望程序运行如下:1。孩子运行firefox(它确实如此)2。爸爸打印DAD即将杀死U(到目前为止一样好)3。firefox会打开3秒钟然后关闭(也是这样)4。子进程将完成运行execv并打印“IVE BEEN KILLED”。 这不会发生。

我的目的是要知道execv运行的程序已经通过在execv继续运行之后立即引发一些标志来完成(其中我已被杀死了printf)。 除非必要,否则我有几千行的代码并且不想使用其他方法。

谢谢

execv()用新进程替换当前进程。 当通过execv()启动firefox时printf("IVE BEEN KILLED\n")在进程中基本上不再存在,并且永远不会被执行(参见man execv )。 父进程有可能通过使用wait()等待子firefox退出,或者通过信号(例如signal(SIGCHLD, child_exit_handler) )提醒子进程死亡。

你已经杀死了孩子,它没有捕捉到信号,所以它就死了。 至少它会在exec返回时发生,但事实并非如此。 因此,只有在exec失败时才执行打印。

如果您想知道您的孩子是否已经完成,请使用wait电话。

另请注意,由于您的孩子没有退出,它将执行父pid的代码,这可能很有趣。