进程
进程概念:一个正在运行的程序
pid:唯一标识一个进程/pcb:进程控制块(进程描述符),描述一个进程的属性信息的结构体
进程状态:就绪 运行 阻塞
僵死进程:1.子进程先结束,2.父进程没有调用wait获取子进程的状态信息(退出码)-》(系统不删子进程的PCB)
1.fork复制进程流程 复制PCB,重新分配新的pid(修改才重新分配,其他先共享(提高效率))
1)在父进程中,fork返回新创建子进程的进程ID;
2)在子进程中,fork返回0;
3)如果出现错误,fork返回一个负值-1;
其实就相当于链表,进程形成了链表,父进程的fpid(p 意味point)指向子进程的进程id, 因为子进程没有子进程,所以其fpid为0.
fork与vfork的区别?
1. fork要拷贝父进程的数据段;而vfork则不需要完全拷贝父进程的数据段,在子进程没有调用exec和exit之前,子进程与父进程共享数据段
2. fork不对父子进程的执行次序进行任何限制;而在vfork调用中,子进程先运行,父进程挂起,直到子进程调用了exec或exit之后,父子进程的执行次序才不再有限制
2.系统最多能够运行多少进程?不考虑内存够不够,int上限,宏定义:32768,到了回头找(从300开始)
3.fork使用
int main()
{
fork||fork;
printf(“A\n”);
} //搞清楚 几道题
4.fork什么被复制,什么在共享
文件共享:父进程打开的文件,在fork后可以在子进程中访问
子进程复制父进程的数据空间(数据段)、栈和堆,父、子进程共享正文段。对于程序中的数据,子进程要复制一份,但是对于指令,子进程并不复制而是和父进程共享。
文件共享:父进程打开的文件,在fork后,可以在子进程中访问
写实拷贝(以页为单位):一个页中的数据发生改变,整个页要重新拷贝
Exec系列 替换进程
主函数:int main(int argc,char* argv[],char* envp[])
Argc:参数个数 argv:参数内容 envp:环境变量
文件描述符:每打开一个文件,就得到一个文件描述符
Open read write close