基本概念:
在操作系统里,进程是正在运行的程序的实例。fork()
函数的作用是复制当前进程,生成一个新的进程,这个新进程被称作子进程,而原本的进程则是父进程。这两个进程(父进程和子进程)会从 fork()
调用处开始,并发执行后续代码。
使用 fork()
创建子进程时:
代码段:父子进程共享,因其只读,可节省内存。
内存:初始时数据段、堆、栈物理页共享;有写操作时,执行写操作的进程会复制物理页,保证进程数据独立。
头文件:
#include <sys/types.h>
#include <unistd.h>
函数原型:
pid_t fork(void);
返回类型:
子进程为0;父进程中为子进程ID
出错为-1
示例:
#include <iostream>
#include <sys/types.h>
#include <unistd.h>using namespace std;// main函数启动,程序主进程
int main()
{// fork作用:创建新的子进程// 一次调用 ,两次返回pid_t pid = fork();if (pid == 0){while (1){cout << "I am a child process with PID: " << pid << " getpid=" << getpid() << endl;sleep(1);}}else if (pid > 0){while (1){cout << "I am a parent process with PID: " << pid << " getpid=" << getpid() << endl;sleep(1);}}return 0;
}
注意事项:
资源复制:fork()
会复制父进程的大部分资源,例如内存空间、文件描述符等。这可能会带来较大的开销。
僵尸进程和孤儿进程:若子进程先于父进程结束,且父进程没有正确处理子进程的退出状态,子进程会变成僵尸进程;若父进程先结束,子进程会变成孤儿进程,被 init
进程(进程 ID 为 1)收养。