LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1093|回复: 8

请教一下socket fd和系统资源的关系

[复制链接]
发表于 2005-10-4 11:12:39 | 显示全部楼层 |阅读模式
一个多线程的程序。
第一个客户端向它连接,获得一个socket fd为3,可以正常通信
第二个客户端向它连接,又获得一个socket fd为3,也可以正常通信!

我用getpeername获得对方的端口,确实是不同的。这是为什么呢?
难道一个sockfd对应不同的系统资源吗?
还有就是关闭fd的时候,我需要在线程中close一次,再到进程中close一次,这又是为什么呢?
谢谢了!!!
发表于 2005-10-4 11:53:58 | 显示全部楼层
因为fork之后, 父进程和子进程共享这个struct file(这时它的refcnt为2), close系统调用首先将refcnt减1, 如果refcnt为0, 就回收struct file占用的资源。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-4 12:16:26 | 显示全部楼层
我是用多线程,而不是多进程来做的。
先新建n个进程,这些子进程等待,并用stderror管道与父进程通信。父进程accpet一个socket后,会讲connection fd传给子进程,子进程来处理处理。这种情况下还需要close两次吗?
回复 支持 反对

使用道具 举报

发表于 2005-10-4 15:27:06 | 显示全部楼层
Post by marvel
我是用多线程,而不是多进程来做的。
先新建n个进程,这些子进程等待,并用stderror管道与父进程通信。父进程accpet一个socket后,会讲connection fd传给子进程,子进程来处理处理。这种情况下还需要close两次吗?

可以这样传递吗?这样仅仅是传递了一个整数,子进程中并不一定有这个fd,或者即时有也不会对应于刚刚accept的那个socket。 就是说accept的那个socket在父进程中打开了,在子进程中并没有打开
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-4 16:38:37 | 显示全部楼层
但是现在是可以运行的,只是close不了fd。
这个模型是看了unix网络编程的TCP preforked Server,Desciptor Passing
就是30.9里面的那个。
我也不太明白,希望有高手能指点一下
回复 支持 反对

使用道具 举报

发表于 2005-10-5 13:49:09 | 显示全部楼层
我也正在看这本书,但是还没有看到这里,确实可以,而且还可以在无关联的进程间传递,不光是父子进程,需要使用unix domain socket,我看得是unp第二版,可能现在又可以用pipe了吧,
回复 支持 反对

使用道具 举报

发表于 2005-10-5 20:15:53 | 显示全部楼层
楼主的程序真的是多线程的吗?不妨把代码贴出来看看。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-5 20:32:38 | 显示全部楼层
寒,会不会太多了?
好多的。
我对于每一个连接一个进程,
由于我做得是代理服务器,所以每一个进程有新建四个线程,用于发送接受客户端和服务器端的数据。
现在基本上可以了,我把close用shutdown代替就好了,
不过,时间一长,父进程就会异常退出。不知道是为什么
回复 支持 反对

使用道具 举报

发表于 2005-10-6 11:17:58 | 显示全部楼层
Post by marvel

还有就是关闭fd的时候,我需要在线程中close一次,再到进程中close一次,这又是为什么呢?
谢谢了!!!

由于没有看到代码,只能在理论上作点分析了。  :confused:
close只是将套接字的访问计数减一,一直到访问计数为0时,才真正的关闭套接口。用shutdown则可以不管访问计数,直接激发TCP的正常链接终止序列。
具体的你可以参考UNPv1
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表