- 进程id。系统中每个进程有唯一的id,在C语言中用pid_t类型表示,其实就是一个非负整数。
- 进程的状态,有就绪、运行、挂起、停止等状态。
- 进程切换时需要保存和恢复的一些CPU寄存器。
- 描述虚拟地址空间的信息。
- 描述控制终端的信息。
- 当前工作目录(Current Working Directory)。
- umask掩码。
- 文件描述符表,包含很多指向file结构体的指针。
- 和信号相关的信息。
- 用户id和组id。
- 会话(Session)和进程组。
- 进程可以使用的资源上限(Resource Limit)。
循环创建n个子进程
#include
#include
#include
int main(void) { int i; pid_t pid; printf("xxxxxxxxxxx\n"); for (i = 0; i < 5; i++) { pid = fork(); if (pid == 0) { break; } } if (i < 5) { sleep(i); printf("I'am %d child , pid = %u\n", i+1, getpid()); } else { sleep(i); printf("I'm parent\n"); } return 0; }
子进程复制了父进程0-3G用户空间内容,以及父进程的PCB,但pid不同。真的每fork一个子进程都要将父进程的0-3G地址空间完全拷贝一份,然后在映射至物理内存吗?
重点注意!躲避父子进程共享全局变量的知识误区! 每个有子集单独的date区
【重点】:父子进程共享:1. 文件描述符(打开文件的结构体) 2. mmap建立的映射区 (进程间通信详解)
fork之后父进程先执行还是子进程先执行不确定。取决于内核所使用的调度算法
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/209316.html原文链接:https://javaforall.net
