fork函数
创建子进程,pid_t pid = fork();
成功:父进程返回子进程id,子进程返回0;
失败:父进程返回-1,子进程不会被创建
使用fork函数循环创建子进程示例
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
int main(int argc, char** argv)
{
int i;
for (i = 0; i < 5; i++) {
//仅通过父进程创建子进程
if (fork() == 0) {
break;
}
}
if (i == 5) {
sleep(5);
printf("parent process.");
}
else {
sleep(i);
printf("child process %d.", i+1);
}
return 0;
}
子进程与父进程的相同之处(刚fork之后)
- 全局变量
- .data
- .text
- 栈
- 堆
- 环境变量
- 用户ID
- 宿主目录
- 进程工作目录
- 信号处理方式
子进程与父进程的不同之处
- 进程ID
- fork返回值
- 父进程ID
- 进程运行时间
- 闹钟(定时器)
- 未决信号集
父子进程间读写原则
- 读时共享,写时复制
- 父子进程的全局变量不是共享的!
- 父子进程共享:
- 文件描述符
- mmap简历的映射区