• 请不要在回答技术问题时复制粘贴 AI 生成的内容
b00tyhunt3r
V2EX  ›  程序员

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

  •  
  •   b00tyhunt3r · Sep 5, 2019 · 3389 views
    This topic created in 2469 days ago, the information mentioned may be changed or developed.
    发射一个 SIGCHLD 信号给老父亲然后嗷一声就终止了?求解!
    sfqtsh
        1
    sfqtsh  
       Sep 5, 2019 via Android
    Zombie?
    b00tyhunt3r
        2
    b00tyhunt3r  
    OP
       Sep 5, 2019
    @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  
       Sep 5, 2019 via iPhone
    @b00tyhunt3r pid!=0 自己退出了 然后 child 被 init 收养了
    forcecharlie
        4
    forcecharlie  
       Sep 5, 2019 via iPhone
    @b00tyhunt3r 而且你的 execve 应该是失败了 成功没有返回
    b00tyhunt3r
        5
    b00tyhunt3r  
    OP
       Sep 5, 2019
    @forcecharlie
    子进程执行 execve 以后, 父进程为什么会终止?该终止的不是子进程吗

    不知道 getpid 能否得到僵尸进程的 pid
    raptium
        6
    raptium  
       Sep 5, 2019 via iPhone
    execve 后面的代码不会执行了吧?怎么还能 print 出来的
    b00tyhunt3r
        7
    b00tyhunt3r  
    OP
       Sep 5, 2019
    信号果然没人说得清吗。。。有没有大牛来救场的
    ysc3839
        8
    ysc3839  
       Sep 5, 2019
    @b00tyhunt3r 你写错了吧?确定不是 "/bin/date" 而是 "bin/date"?
    fairytale
        9
    fairytale  
       Sep 5, 2019 via iPhone
    execve 不是用新命令替换自身内存空间么?后面下一行的代码不会执行了。新命令想终止就自然终止呗。
    记得 execve 之前先 fork,否则就是自身被替换。2 楼的代码没毛病,但是建议换个执行时间长的命令,date 执行时间太短了。
    47jm9ozp
        10
    47jm9ozp  
       Sep 5, 2019
    @b00tyhunt3r 父进程的 pid 变量不等于 0,后面没代码了,难道不就退出了……
    fairytale
        11
    fairytale  
       Sep 5, 2019 via iPhone
    类似 date 这种秒退,当然发送 SIGCHLD 了啊。换个 sleep10,就 10 秒后 SIGCHLD
    fairytale
        12
    fairytale  
       Sep 5, 2019 via iPhone
    10 喽说的对,里面两个 print 放到引号外面,再加个 sleep。
    fairytale
        13
    fairytale  
       Sep 5, 2019 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  
       Sep 5, 2019 via Android
    子进程 execve 后,进城地址空间被新程序覆盖了,你后面两个 printf 是不会执行的,你测试发现执行了是因为你调用 execve 的方式错了,导致 execve 执行失败。
    x1314aq
        15
    x1314aq  
       Sep 6, 2019 via iPhone
    @b00tyhunt3r 父进程执行完 fork()后就正常退出了,return 0 正常退出了;子进程被 init 收养,然后子进程的 execve 失败,pintf 出来的 ppid=1 ;你要想像正常的多进程程序那样,得加一个 else 分支,在 else 分支里,父进程调用 wait(),等待子进程结束
    lolizeppelin
        16
    lolizeppelin  
       Sep 6, 2019
    你 fork 以后啥都没 进程不退出还能干啥 233
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3231 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 69ms · UTC 11:10 · PVG 19:10 · LAX 04:10 · JFK 07:10
    ♥ Do have faith in what you're doing.