Linux下进程池实现
各位高手:
我现在接手一项工作:用c/c++写一个进程池,要求:
1 客户端只有一个,但是却在不停的发报文,所以服务器端与客户端建立socket长联接,(即服务端只accept客户端联接请求一次,之后就在这个套结字上循环接收,处理客户端的报文,每次收到一个报文,就起一个子进程处理这个报文,因为一秒钟可能收到几百条报文,而处理每条报文需要一段时间,如果不设进程池,就有可能积累过多进程,尽管可以在每个子进程处理完后就结束掉,来了新的报文就起新进程,但是有一种说法认为:每天假设有100万报文,就需要起100万次进程,假设Linux系统关掉每个子进程都回产生一些垃圾,就会导致形系统崩溃,我虽然认为这种看法不必要,因为Linux作为一个成熟的系统,结束一个子进程(exit),怎么会产生垃圾?但不得不按循环利用子进程池方案作:起固定个数子进程后,每个处理报文的子进程 处理完后不结束,而是通知(怎样通知?管道)管理进程自己空闲,等待调用,来了新的报文,由某一管理进程查询哪个子进程空闲,使用之,请问上述循环利用固定数目的进程池怎样实现?
查了包括本论坛在内的好多资料,都是只讲方法,没有代码,给我的做项目时间有限,能否请做过的贴代码上来?多谢!
我已有的通讯代码如下:(没有进程池代码)
recvFrontSock = accept(listenFrontSock, (__SOCKADDR_ARG )&peer , (socklen_t*)&addrlen2);
for (;;)// 循环接收客户端发来的终端报文
{
read_bytes = read(recvFrontSock, buff, received);
if (fork() == 0)// 每次收到客户端发来的报文就起一个子进程处理
{
process(socketToCore, semid, shm_id, shm_field8583id, pid, buff);
// 处理完后如何通知管理进程自己空闲?等待(睡眠等待??)重新调用
}// if (fork() == 0)
}//for (;;)