fork()kill()和execv()

时间:2012-11-08 14:08:19

标签: c 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(它确实如此) 爸爸打印爸爸去杀人(到目前为止一切都好) 3. Firefox将打开3秒然后关闭(也是这样) 4.孩子的过程将完成运行execv并打印&#34; IVE BEEN KILLED&#34;。这不会发生。

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

由于

2 个答案:

答案 0 :(得分:2)

execv()用新流程替换当前流程。当 firefox 通过execv()启动时,printf("IVE BEEN KILLED\n")基本上不再存在,并且永远不会执行(请参阅man execv)。父进程有可能等待子进程 firefox ,使用wait()退出,或者通过信号警告子进程死亡(例如{{ 1}})。

答案 1 :(得分:0)

你已经杀死了这个孩子,但它并没有抓住这个信号,所以它就死了。至少如果exec返回它会,但它没有。因此,如果执行失败,您只能执行打印。

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

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