fork函数初识

February 9, 2019 PWN 访问: 32 次

介绍

UNIX及类UNIX(UNIX-like)系统中的分叉函数。fork函数将运行着的程序分成2个(几乎)完全一样的进程,每个进程都启动一个从代码的同一位置开始执行的线程。这两个进程中的线程继续执行,就像是两个用户同时启动了该应用程序的两个副本。

返回值

  • 若返回值为“-1”:则调用fork函数出错。
  • 在子进程中返回0。
  • 在父进程中返回子进程的PID。

Example

在网上讲fork时举例子举的最多的是:

#include <unistd.h>
#include <stdio.h>
int main ()
{
    pid_t fpid; //fpid表示fork函数返回的值
    int count=0;
    fpid=fork();
    if (fpid < 0)
        printf("error in fork!\n");
    else if (fpid == 0) {
        printf("i am the child process, my process id is %d\n",getpid());
        printf("子程序\n");
        count++;
    }
    else {
        printf("i am the parent process, my process id is %d\n",getpid());
        printf("主程序\n");
        count++;
    }
    printf("统计结果是: %d\n",count);
    return 0;
}
运行结果:
    i am the child process, my process id is 5574
    我是爹的儿子
    统计结果是: 1
    i am the parent process, my process id is 5573
    我是孩子他爹
    统计结果是: 1

但是,在我电脑上运行这个程序的时候,运行结果是相反的:

➜  fork函数 ./wxm
i am the parent process, my process id is 11373
主程序
统计结果是: 1
i am the child process, my process id is 11374
子程序
统计结果是: 1
➜  fork函数

于是乎我就在虚拟机上有试了试,但是结果仍然是这个,那我就很纳闷了。IDA远程调试一波。fork函数下断点。单步执行fork函数,发现这个是先运行了子程序,然后再运行了主程序。

然后我又用gdb在本机上调试了一下,同样在call fork函数下断点。但不执行发现是先运行了主程序,再运行了子程序。

添加新评论