多进程情况下文件句柄共享的问题
2015-04-19 00:58
281 查看
1 Linux中的父子进程
fork() 和 clone()系统调用可用来建立新的进程。这两个系统调用结束时,内核在系统的物理内存中为新的进程分配新的 task_struct 结构,同时为新进程要使用的堆栈分配物理页。Linux 还会为新的进程分配新的进程标识符。然后,新 task_struct 结构的地址保存在链表中,而旧进程的 task_struct 结构内容被复制到新进程的 task_struct 结构中。在克隆进程时,Linux 允许两个进程共享相同的资源。可共享的资源包括文件、信号处理程序和虚拟内存等(通过继承)。当某个资源被共享时,该资源的引用计数值会增加 1,从而只有两个进程均终止时,内核才会释放这些资源。
2 Socket服务器简单并发框架
pid_t pid; int fdListen, fdConnect; fdListen = socket(...); bind(fdListen, ...); listen(fdListen, ...); for (...;...;...) { fdConnect = accept(fdListen, ...); if ((pid = fork()) == 0) { //子进程 //重要!关闭共享的文件描述符,使引用计数-1 close(fdListen); doSomething(); close(fdConnect); exit(0); } //父进程 //重要!关闭连接FD,使其由子进程管理,引用计数-1 close(fdConnect); }
由于子进程会共享父进程的文件,所以在上例中,子进程被创建后,父进程的监听/连接FD会与子进程共享,且引用计数加一。但这是不需要的,所以对子进程而言,需要关闭监听FD,对父进程而言,需要关闭连接FD。虽然在进程退出后,所有的文件描述符均会释放,但是在合理的时间释放这些资源可以避免FD泄漏或者系统FD资源不足等问题。
相关文章推荐
- SharePreference原理及跨进程数据共享的问题
- python多进程中的队列数据共享问题
- python多进程并发中,解决数据共享问题Value+Array
- 关于进程和线程对于全局变量共享的问题学习总结
- 父子进程数据共享问题
- 不同进程间的共享问题
- 解决SQL Server 2005 登录问题(provider: 共享内存提供程序, error: 0 - 管道的另一端上无任何进程。)
- 父子进程数据共享问题
- 解决在IE8浏览器里,在同一个IE进程中的不同选项卡之间的sessionID共享问题
- 子进程共享父进程代码段的问题
- 探究Python多进程编程下线程之间变量的共享问题
- 多个插件共享同一进程的问题
- 在静态库下使用MFC和共享DLL下使用MFC 这两种情况 opencv的配置,以及配置opencv配置中容易出现的问题
- 多进程与多线程的优劣 与 共享内存的同步问题
- 通过SharedPreferences实现进程间数据共享的问题详解
- 跨进程访问共享内存的权限问题
- linux进程内存共享---实现生产者消费者问题
- 关于进程和线程对于全局变量共享的问题学习总结
- fork()后父子进程间的变量共享情况
- 一个问题:物理内存有限的情况下,多个进程存在时,每个进程实际分配的物理内存有多少?(如果某程序申请了很大的动态存储空间)