fork()的杀()和execv()(fork() kill() and execv())

2019-09-30 04:55发布

我在这里想一个小单元测试。 但是,如我所料的程序不能正常工作。

    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,火狐将开启3秒,然后关闭(这是否太)4,子进程将完成运行execv和打印“IVE被杀害”。 这不会发生。

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

谢谢

Answer 1:

execv()替换为一个新的进程当前进程。 当Firefox通过启动execv()printf("IVE BEEN KILLED\n")基本上是在这个过程中不再存在,并且将永远不会被执行(见男子execv )。 这将是可能的父进程使用等待的孩子, 火狐 ,退出观望()或通过信号(例如被提醒到子进程的死亡signal(SIGCHLD, child_exit_handler)



Answer 2:

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

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

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



文章来源: fork() kill() and execv()
标签: c fork execv