当前位置: 技术问答>linux和unix
描述字在进程间的传递与共享内存
来源: 互联网 发布时间:2016-06-11
本文导语: 小弟正在做一个简单的LINUX聊天室,服务器端有2个进程,父进程进行连接请求的监听,子进程处理监听请求,父进程和子进程间用共享内存进行通信(不是管道哦~)。每当有新连接时,父进程accept,生成s...
小弟正在做一个简单的LINUX聊天室,服务器端有2个进程,父进程进行连接请求的监听,子进程处理监听请求,父进程和子进程间用共享内存进行通信(不是管道哦~)。每当有新连接时,父进程accept,生成socket描述字,并将此socket描述字写入共享内存中,写完后并不关闭它。子进程从共享内存中读取父进程写入的socket描述字,之后用select进行轮询所有活动socket,读取客户端发来的消息并进行转发。
现在的问题在于,由于socket描述字是int 类型的,子进程在select的时候并不把它作为socket描述字处理,而只是简单的把它当作整数数据,故而select失败,返回-1。
在《UNIX网络编程》里,父子进程是通过UNIX域管道进行描述字传输的,但是我就是想用共享内存做,不知道能不能实现呢?如果可以,该怎么做?希望各位高人不令赐教~~
现在的问题在于,由于socket描述字是int 类型的,子进程在select的时候并不把它作为socket描述字处理,而只是简单的把它当作整数数据,故而select失败,返回-1。
在《UNIX网络编程》里,父子进程是通过UNIX域管道进行描述字传输的,但是我就是想用共享内存做,不知道能不能实现呢?如果可以,该怎么做?希望各位高人不令赐教~~
|
当然不行哦!
首先要明白,描述字是进程相关的,比如进程A中clifd = accept(...),假设返回sockfd为5
但是另外一个进程B中描述字5与这个socket根本就没有关系。
其次《UNIX网络编程》里用的传递描述字的,是需要内核来实现的,大致原理如下。
当发送进程A请求传递描述字fd,接收进程B正在等着读出描述字时:
进程A中,fd是关联到一个socket(或者管道等等)的,内核会为接收进程打
开一个描述字,并关联到相同的socket,然后把描述字返回给进程B。
首先要明白,描述字是进程相关的,比如进程A中clifd = accept(...),假设返回sockfd为5
但是另外一个进程B中描述字5与这个socket根本就没有关系。
其次《UNIX网络编程》里用的传递描述字的,是需要内核来实现的,大致原理如下。
当发送进程A请求传递描述字fd,接收进程B正在等着读出描述字时:
进程A中,fd是关联到一个socket(或者管道等等)的,内核会为接收进程打
开一个描述字,并关联到相同的socket,然后把描述字返回给进程B。
|
个人理解 不行吧 单传一个 int 文件描述符(套接字)。 fork之前这个文件描述符存在则fork之后父子进程共享文件描述符表 (其实就是文件对象表) 子进程当然也能访问那个 文件对象 但是你这个是父进程fork子进程之后新创建的套接字描述符 单单传一个int值又有什么用呢 现子进程文件对象表根本没有这个东东。。。
传递描述字 一般用sendmsg ioctl 做。。。 一般收到的 int 数值 也跟原来的不一样。。。
传递描述字 一般用sendmsg ioctl 做。。。 一般收到的 int 数值 也跟原来的不一样。。。
|
你进入了一个很囧的情况。
select本身一般不跟多进程共用。
你这样要么多进程就可以搞定,不需要select,就是说,一个连接一个进程。
实在想用的话建议多线程+select。
http://www.cppblog.com/darkdestiny/archive/2009/01/03/71074.html
|
文章不错,现在有个客户的要求让我比较为难。
需要保持上万个TCP连接, 每秒要处理1000个请求(处理时间在500毫秒左右)
原来的程序是用对每个请求fork的,当时没有这么多连接,OS一般也不支持线程。
用fork的方式实在太耗资源了,现在考虑用多进程加多线程。