多进程情况下文件句柄共享的问题

来源:互联网 发布:mac网站老是跳转 编辑:程序博客网 时间:2024/06/05 11:07

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资源不足等问题。

0 0
原创粉丝点击