fork函数:
pid_t fork(void)
创建子进程。父子进程各自返回。父进程返回子进程pid。 子进程返回 0.
getpid();getppid(); >0 父进程 =0 子进程
循环创建N个子进程模型。 每个子进程标识自己的身份。
父子进程相同:
刚fork后。 data段、text段、堆、栈、环境变量、全局变量、宿主目录位置、进程工作目录位置、信号处理方式
父子进程不同:
进程id、返回值、各自的父进程、进程创建时间、闹钟、未决信号集
父子进程共享:
读时共享、写时复制。———————— 全局变量。
- 文件描述符
2. mmap映射区。
每个进程在内核之中都有一个进程控制块(PCB)来维护进程的相关信息,Linux内核的进程控制块是task_struct结构体。
PCB进程控制块: 进程id,系统中每个进程都有唯一的id,在C语言中使用pid_t类型表示,其实就是一个非负整数。进程的状态,有就绪,运行,挂起,停止等状态。进程切换的时候需要保存和恢复一些进程的信息。文件描述符表,包含很多指向file结构体的指针,和信号相关的信息,用户id和组id。
ps -aux :当前进程的id.
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <pthread.h> int main(int argc, char *argv[]) { int i; pid_t pid; for (i = 0; i < 5; i++) { if (fork() == 0) // 循环期间, 子进程不 fork break; } if (5 == i) { // 父进程, 从 表达式 2 跳出 sleep(5); printf("I'm parent "); } else { // 子进程, 从 break 跳出 sleep(i); printf("I'm %dth child ", i+1); } return 0; } gdb调试: 设置父进程调试路径:set follow-fork-mode parent (默认) 设置子进程调试路径:set follow-fork-mode child