当前位置:  技术问答>linux和unix

关于Linux多进程与socket概念性问题与解决方案

    来源: 互联网  发布时间:2015-12-27

    本文导语:  小弟最近要编写一个服务器,和一个固定的客户端通信,该客户端是突发性发送数据,而且会一次发送很多数据。服务器采用的是fork多进程对客户端每一个特定数据进行处理,而不是来一个消息开一个进程。子进程...

小弟最近要编写一个服务器,和一个固定的客户端通信,该客户端是突发性发送数据,而且会一次发送很多数据。服务器采用的是fork多进程对客户端每一个特定数据进行处理,而不是来一个消息开一个进程。子进程在处理中需要和客户端进行通信。为了稳定,不考虑多线程。
问题如下:
1.以前我主进程accept之后,再fork,那么子进程相当于也执行了前面的连接过程,可以继续使用msssage_socket与客户端进程通信。但是现在我是先fork子进程,固定对某个类型信息进行处理,然后主进程才进行socket连接,我通过共享内存把msssage_socket给子进程,子进程却不能与客户端通信了,会报文件描述符错误。我想知道有没有简单的方法可以让子进程和客户端通信?
2.我想问下socket连接池这个概念,socket连接池保存的是什么?是socket获得的套接字(connect_socket)还是accept获得的msssage_socket?感觉从socket池取出一个连接就可以进行socket通信了,感觉悬悬的,连接的建立不是要针对特定客户端吗?像我如果只和一个客户端进行通信,是不是就可以?
3.
“主控制进程、连接处理进程、一组处理进程;其中主控制进程负责监控其他进程;连接处理进程首先是负责消息接入,接受消息,消息写入数据池,消息返回;处理进程是对数据迟中的数据进行处理,处理完成后将结果写入返回数据池,由接入进程返回给客户端,这个可以做成异步处理或者阻塞处理”
这个是前面某个帖子中回复的内容。我想问下,“主控制进程负责监控其他进程”是不是就是这个进程和其它进程进行通信,来转递数据?我的服务器好像把主控制进程和连接处理进程写在一个进程了,或者说我这样写那么子进程就不能和客户端通信了,应该是子进程如果要和客户端通信,那么就需要把要通信的数据发回给我的主进程,让主进程使用和客户端建立的socket通信,得到结果再发回给子进程。那么按照上面给的解决方案,就是主控制进程其实也不掌握socket连接,需要连接处理进程把内容发给主控制进程进行转发。不知道我的理解对不对?
  综上所述:我的子进程想通过主进程建立的message_socket直接和客户端通信,没门。只能把要通信的数据再通过共享内存发回给主进程,让主进程和客户端通信,再把结果发回来给子进程。   如果想写的更好,更稳定,层次更清晰,就应该把我的主进程拆分为主控制进程、连接处理进程(这样比原来的方案每一个方面都好吗?)
是不是这样啊?外加一个socket池的问题。
有点啰唆了。

|
你可以直接对socket的描述符进行操作,linux里面就是文件的概念。
比如如果你的socket描述符是22,那你write/read  22都可以收发数据。
但是你建两个同样的socket是不可以的。
似乎上面说的对你的三个问题都有用。
由于你是1--1的情况,建议你

             共享内存
接收进程------消息环----分拣进程---处理进程(n)

|
猪头怎么也跑这来了?
打声招呼先:)
==================================
我不知道LZ的需要是什么,理解能力有点差,也懒得去想
以前我作过这么一个设计:
把accept的socket 放到一个队列中,包括一些辅助信息了,然后会对这些socket进行轮询,如果有数据接收、解析,根据解析结果放到相应的管道,而每个管道各自有一个进程在负责处理这些消息。再建立一个发送的管道,所有需要发送的数据(包括辅助信息,不然不知道用哪个socket来发送)都放入这个管道中,刚才的接收进程在接收之前或者之后,处理这个发送队列。

这么设计是因为我的处理过程比较烦琐,而且处理过程返回也不是同步的,而数据量不是很大的情况。如果你数据量非常大,那么这个就不适合你了,也许你需要的是给每个连接产生一个线程,或者使用线程池

|
为了稳定,不考虑多线程。

对于楼主这句话表示怀疑

如果设计得当,线程一样很稳定,而且性能绝对比多进程要好得多

|
1、参考 APUE 和 UNP 都有的,用 AF_LOCAL socket 传递文件描述符的方法。

至于架构设计的问题,需要具体分析性能和要求。。

|
没看明白,首先你和客户端有几个socket连接,是多个连接,还是就一个连接。是短连接,还是长连接。

看楼主的意思,应该是一个连接,好像还是长连接吧!

不过,没看明白的是,你的recv在哪?是在主进程还是子进程。
如果是在父进程中,recv/send是在一个进程中,那么就不用fork多个子进程了呀!

|
linux下的线程不是很高效,根本不能和windows下的线程等同起来。

给你个网址,自己看看吧

http://zhoulifa.bokee.com/5378803.html

|
多个进程之间的fd定义是不一样的,你先fork,主进程先accept再把sock_fd这个整数传给另一个进程,另一个进程根本就没有这个fd,所以是非法的fd.

你这种情况下,既然想prefork一组进程,最简单的是每个子进程直接accept(),accept一个连接之后,完整的处理一个连接直到关闭就可以了。


|
如果你的client会比较多,也就是同时的并发连接可能很多的时候,可能这样做的情况下,新的连接可能很久都没有人accept,建议使用epoll或者select模型,主进程负责所有的网络操作。
收到的数据通过SHM转给一组子进程来处理。

    
 
 

您可能感兴趣的文章:

  • 关于linux下管道的概念性问题
  • linux asm 启动 bios 等很多概念性的问题请教
  • linux僵尸(zombie)进程介绍及清除
  • 高手请教!linux怎样通过pid获取进程信息,如:进程名、进程状态等?
  • linux下进程占用内存空间详解
  • linux命令如何实现重启父进程而不会使其子进程退出
  • Linux进程的内核栈和用户栈概念,相互关系及切换过程
  • Linux中最多同时可以开多少个进程,一个进程可以开多少个线程?
  • linux下进程间通信:共享内存原理及具体用法举例(基于c/c++语言)
  • Linux守护进程 的子进程 终端处理
  • Linux内核进程与应用进程的通信方式有哪些?
  • 在linux,如何用共享内存来实现进程间的通讯?(这些进程没有父子关系)
  • linux下system函数调用shell命令后,怎样让主进程不等子进程返回,接着执行(在线)?
  • linux进程(线程)运行过程中如何获取本进程当前的内存使用状况,统计信息?
  • 如何linux下监控进程及其子进程占用资源?
  • linux下的进程如何访问另外一个进程建立的mutex?
  • linux中用killall命令杀死进程的时候会释放掉该进程所占有的内存吗?
  • linux内核高手进!关于调用__fork()时0号进程的子进程才能与父进程共享PID的困惑
  • 请教:在Linux下怎么样检测一个进程是否是僵尸进程??
  • 请问linux进程的哪些信息保存在内核里?哪些信息又保存在进程空间里?谢谢
  • Linux下请教一个父进程杀死子进程的问题.
  • 怎么查看Linux中所运行的进程,并且知道哪些是停止响应的,用什么命令可以杀掉停止响应的进程?
  • 【求助】linux/Unix下创建子进程,向父进程发送信号,子进程也能收到改信号,此时如何让子进程不收到信号
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • LINUX下有没有线程概念,和WIN下线程概念有什么不同,谢谢.
  • 请问unix/linux下Cb编程中,是否有工程的概念。
  • 在Linux里有没有DLL这个概念?
  • windows下编程中有没有linux编程中管道和信号的概念?
  • Linux的线程库pthread是否有"亲缘性"的概念?
  • linux2.4到2.6,信号的概念有哪些变化?
  • Linux下有类似于windows服务的概念?
  • linux概念问题
  • 新手,问linux有windows的 WaitforSingleObject的概念吗
  • linux有对应windows中的注册表概念吗?
  • 学习linux下编程时,一些概念问题,请帮助解释,谢谢
  • Linux下的执行文件是什么概念,是象Dos里的2进制机器码吗,怎么看一个文件是不是执行文件.
  • linux 共享内存操作概念问题————————————————(跪请指教)
  • Linux下有没有磁盘整理的概念?
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux
  • linux命令大全详细分类介绍及常用linux命令文档手册下载
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在没有linux的盘,只有DOS启动盘)
  • Linux Kernel 'sctp_v6_xmit()'函数信息泄露漏洞
  • 如何让win2000和linux共存。我装好WIN2000,再装LINUX7.0,但LILO只能找到LINUX,不能引导WIN2000
  • linux c下利用srand和rand函数生成随机字符串
  • 在windows中的VMware装了个linux,主板有两个串口,能做windows和linux的串口通信测试么,怎么测试这两个串口在linux是有效
  • Linux c++虚函数(virtual function)简单用法示例代码


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3