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函数下断点。但不执行发现是先运行了主程序,再运行了子程序。