首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fork() kill()和execv()

fork() kill()和execv()
EN

Stack Overflow用户
提问于 2012-11-08 22:08:19
回答 2查看 3.3K关注 0票数 1

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

代码语言:javascript
复制
    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 BEEN KILL“。这是不会发生的。

我的目标是知道execv运行的程序是否在execv继续运行后立即引发了一些标志(我被杀死的printf所在的位置)。我有一个几千行的代码,除非有必要,否则我不想使用其他方法。

谢谢

EN

回答 2

Stack Overflow用户

发布于 2012-11-08 22:14:11

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

票数 2
EN

Stack Overflow用户

发布于 2012-11-08 22:15:13

你杀了孩子,它没有捕捉到信号,所以它就死了。至少在exec返回的时候是这样的,但是它没有返回,所以你只需要在exec失败的情况下执行打印。

如果您想知道您的孩子是否完成了,请使用wait调用。

还要注意,当子进程不退出时,它将执行父pid的代码,这可能很有趣。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13290594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档