首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
b00tyhunt3r
V2EX  ›  程序员

在子进程中执行 execve 之后子进程自身处于什么状态?

  •  
  •   b00tyhunt3r · 142 天前 · 1042 次点击
    这是一个创建于 142 天前的主题,其中的信息可能已经有所发展或是发生改变。
    发射一个 SIGCHLD 信号给老父亲然后嗷一声就终止了?求解!
    sfqtsh
        1
    sfqtsh   142 天前 via Android
    Zombie?
    b00tyhunt3r
        2
    b00tyhunt3r   142 天前
    @sfqtsh
    如果是僵尸还好说,然而自己做了个实验,被吓呆了

    int main()
    {
    int pid;
    printf("father:%d\n",getpid());
    pid = fork();
    if (pid ==0)
    {
    execve("bin/date",NULL,NULL);
    printf("child:%d\n",getpid());
    printf("father:%d\n",getppid());
    }
    }

    运行结果:
    father:38215
    child:38216
    father:1

    儿子把父亲杀了??????
    forcecharlie
        3
    forcecharlie   142 天前 via iPhone
    @b00tyhunt3r pid!=0 自己退出了 然后 child 被 init 收养了
    forcecharlie
        4
    forcecharlie   142 天前 via iPhone
    @b00tyhunt3r 而且你的 execve 应该是失败了 成功没有返回
    b00tyhunt3r
        5
    b00tyhunt3r   142 天前
    @forcecharlie
    子进程执行 execve 以后, 父进程为什么会终止?该终止的不是子进程吗

    不知道 getpid 能否得到僵尸进程的 pid
    raptium
        6
    raptium   142 天前 via iPhone
    execve 后面的代码不会执行了吧?怎么还能 print 出来的
    b00tyhunt3r
        7
    b00tyhunt3r   142 天前
    信号果然没人说得清吗。。。有没有大牛来救场的
    ysc3839
        8
    ysc3839   142 天前
    @b00tyhunt3r 你写错了吧?确定不是 "/bin/date" 而是 "bin/date"?
    fairytale
        9
    fairytale   142 天前 via iPhone
    execve 不是用新命令替换自身内存空间么?后面下一行的代码不会执行了。新命令想终止就自然终止呗。
    记得 execve 之前先 fork,否则就是自身被替换。2 楼的代码没毛病,但是建议换个执行时间长的命令,date 执行时间太短了。
    ooxxcc
        10
    ooxxcc   142 天前
    @b00tyhunt3r 父进程的 pid 变量不等于 0,后面没代码了,难道不就退出了……
    fairytale
        11
    fairytale   142 天前 via iPhone
    类似 date 这种秒退,当然发送 SIGCHLD 了啊。换个 sleep10,就 10 秒后 SIGCHLD
    fairytale
        12
    fairytale   142 天前 via iPhone
    10 喽说的对,里面两个 print 放到引号外面,再加个 sleep。
    fairytale
        13
    fairytale   142 天前 via iPhone
    int main()
    {
    int pid;
    char * argv[ ]={"/bin/sleep","10",(char *)0};
    printf("father:%d\n",getpid());
    pid = fork();
    if (pid ==0)
    {
    execve("/bin/sleep",argv,NULL);
    printf("execve failed\n");
    }
    sleep(1);
    printf("child:%d\n",getpid());
    printf("father:%d\n",getppid());
    sleep(10);
    }
    lxy42
        14
    lxy42   142 天前 via Android
    子进程 execve 后,进城地址空间被新程序覆盖了,你后面两个 printf 是不会执行的,你测试发现执行了是因为你调用 execve 的方式错了,导致 execve 执行失败。
    x1314aq
        15
    x1314aq   141 天前 via iPhone
    @b00tyhunt3r 父进程执行完 fork()后就正常退出了,return 0 正常退出了;子进程被 init 收养,然后子进程的 execve 失败,pintf 出来的 ppid=1 ;你要想像正常的多进程程序那样,得加一个 else 分支,在 else 分支里,父进程调用 wait(),等待子进程结束
    lolizeppelin
        16
    lolizeppelin   141 天前
    你 fork 以后啥都没 进程不退出还能干啥 233
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   844 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 26ms · UTC 23:31 · PVG 07:31 · LAX 15:31 · JFK 18:31
    ♥ Do have faith in what you're doing.