fork
一个运行的进程通过调用fork函数就会产生子进程,原来的进程称为父进程,现在这个进程称为子进
子进程在创建的时候会拷贝原来父进程的代码段,数据段。操作系统通过pid进行区
这里需要注
父进程在fork后继续执
而子进程由于拷贝了父进程的PCB模块,程序指针已经不是指向main的开始位置,而是从fork后面开始执行
由于数据段也会拷贝,所以两者的数据段中的初始值都是一样的,也就是读共享了,但是其实两者在不同的地址空间中,所以后续的写入互不相干
在程序中通过fork的返回值来判断当前执行的是哪个进程,如果返回值为0表示是子进程,要获取子进程的进程ID可以采用getpid获取,返回值大于0就是父进程,返回值就是相应子进程的ID号码
实例代码
#include<stdio.
#include<unistd.h
#include<sys/types.h
int main()
printf("begin test fork\n")
int *data1 = new int(1
pid_t pid = fork()
printf("after fork ")
int *data2 = new int(2
if (-1 == pid
perror("fork all")
else if (0 == pid
printf("child process: %d, data1 is %x data2 is %x\n", getpid(), data1, data2
// while(1)
els
printf("parent process %d fork return is %d data1 is %x data2 is %x\n", getpid(), pid, data1, data2)
// while(1)
return
运行结果为
从上面的运行结果来看,子进程运行的位置是在fork之后的,而且两者的数据段的地址是一样
vfo
rk的。:}0;};;{e};);{)};{));;;);; {>>h>:。。。行。意:分。程。