1

我在这里尝试进行小型单元测试。但是程序并没有像我预期的那样工作。

    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.爸爸打印 DAD IS GOING TO KILL U(到目前为止一切顺利) 3.firefox 将打开 3 秒,然后然后关闭(也这样做) 4.子进程将完成运行 execv 并打印“IVE BEEN KILLED”。这不会发生。

我的目标是知道 execv 运行的程序在 execv 继续运行(我被杀死 printf 所在的位置)之后立即通过提高几个标志来完成。我有几千行的代码,除非必要,否则不想使用其他方法。

谢谢

4

2 回答 2

2

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

于 2012-11-08T14:14:11.447 回答
0

你杀了孩子,它没有捕捉到信号,所以它就死了。至少如果 exec 返回它会,但它不会。因此,如果执行失败,您只会执行打印。

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

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

于 2012-11-08T14:15:12.850 回答