linux系统编程之进程(二) fork函数相关总结
(1)、使用fork函数得到的子进程从父进程的继承了整个进程的地址空间,包括:进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设置、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端等。 (2)、子进程与父进程的区别在于: 1、父进程设置的锁,子进程不继承 2、各自的进程ID和父进程ID不同 3、子进程的未决告警被清除; 4、子进程的未决信号集设置为空集。 (3)、fork系统调用需要注意的地方 fork系统调用之后,父子进程将交替执行。 如果父进程先退出,子进程还没退出那么子进程的父进程将变为init进程。(注:任何一个进程都必须有父进程) 如果子进程先退出,父进程还没退出,那么子进程必须等到父进程捕获到了子进程的退出状态才真正结束,否则这个时候子进程就成为僵进程。 子进程退出会发送SIGCHLD信号给父进程,可以选择忽略或使用信号处理函数接收处理就可以避免僵尸进程。 (4)、写时复制 copy on write 如果多个进程要读取它们自己的那部分资源的副本,那么复制是不必要的。 每个进程只要保存一个指向这个资源的指针就可以了。 如果一个进程要修改自己的那份资源的“副本”,那么就会复制那份资源。这就是写时复制的含义 例如fork就是基于写时复制,只读代码段是可以共享的。 若使用vfork()则在还没调用exec之前,父子进程是共享同一个地址空间,不像fork()一样会进行拷贝 (5)、fork之后父子进程共享文件 子进程继承了父进程打开的文件描述符,故每个打开文件的引用计数为2。 (编辑:云计算网_泰州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |