您的位置:首页 > 编程语言 > C语言/C++

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

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资源不足等问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  socket 多进程 C-C++