2012-11-08 29 views
1

我想一个小单元测试在这里。但该计划不能按我的预期工作。现在fork()的杀()和execv()

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 BE KILLED”。这不会发生。

我的目标是要知道哪些execv运行程序已经execv之后提出几个标志完成继续运行(其中香港专业教育学院被杀害的printf是)。 我有一个几千行代码,不想使用其他方法,除非必要。

感谢

+0

我已经重新标记这是C.有没有C++代码中的例子可见一斑! – Rook

回答

2

execv()替换为一个新的进程当前进程。当火狐通过execv()开始的printf("IVE BEEN KILLED\n")基本上不再在这个过程中存在,并且将永远不会被执行(见man execv)。这将有可能对于父进程等待子,火狐,通过使用wait()退出或经由一个信号(例如signal(SIGCHLD, child_exit_handler))被提醒子进程的死亡。

+0

好的。当我手动关闭Firefox的UI时,它会打印IVE BEEN KILLED。 有没有办法让代码发生? –

+0

好的。当我手动关闭Firefox的UI时,它会打印IVE BEEN KILLED。 –

+0

@ user1432779,想必你的意思是_doesn't_ print'我已经被杀死了'。从子进程中可以做到这一点,因为它是firefox,因此调用'execv()'之后的任何行都不应该被调用,除非失败。唯一的办法是让父进程打印该行。 – hmjd

0

你杀了孩子,并没有捕捉到信号,所以它只是死亡。至少如果高管回来了,但事实并非如此。所以如果exec失败,你只能执行打印。

如果你想知道如果你的孩子已经完成,使用wait通话。

也要注意,当你的孩子没有退出,它会再执行父PID的代码,这可能是有趣的。

+0

但父亲不能空闲,直到孩子死亡。它需要保持运行,进而最终会检查是否标志中提出,显示了execv完成(或该进程execv开始已完成) –

+0

Oh..so杀没杀原来的子进程,但打死Firefox取代它的过程? –

+0

@ user1432779,firefox是子进程。 – hmjd