首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态进程池

动态进程池
EN

Stack Overflow用户
提问于 2013-04-30 00:44:55
回答 1查看 1.2K关注 0票数 0

我正在Unix系统上用C语言编写一个客户机-服务器(TCP)程序。客户端发送一些信息,服务器应答。每个子进程只有一个连接。新连接使用池中预先运行的进程,并且池的大小是动态的,因此如果空闲进程(不为客户端提供服务的进程)的数量下降得太少,它应该创建新的进程,同样,如果它变得太高,额外的进程应该被终止。

这是我的服务器代码。每个连接都使用fork()创建一个新的子进程。每个连接都在一个新进程中运行。我如何创建一个像我上面解释的动态池?

代码语言:javascript
复制
int main(int argc, char * argv[])
{
        int cfd;
        int listener = socket(AF_INET, SOCK_STREAM, 0); //create listener socket 
        if(listener < 0){
            perror("socket error");
            return 1;
        }
        struct sockaddr_in addr;
        addr.sin_family = AF_INET;
        addr.sin_port = htons(PORT);
        addr.sin_addr.s_addr = htonl(INADDR_ANY);
        int binding = bind(listener, (struct sockaddr *)&addr, sizeof(addr));
        if(binding < 0){
            perror("binding error");
            return 1;
        }
        listen(listener, 1); //listen for new clients
        signal(SIGCHLD,handler);
        int pid;

        for(;;) // infinity loop on server
        {
            cfd = accept(listener, NULL, NULL); //client socket descriptor
            pid = fork(); //make child proc
            if(pid == 0) //in child proc...
            {
                close(listener); //close listener socket descriptor
                ... //some server actions that I do.(receive or send) 
                close(cfd); // close client fd
                return 0;
            }
            close(cfd);

}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-30 02:58:42

如果您在同一侦听套接字上的accept中阻塞了多个进程,则传入的新连接将传递给其中一个进程。(视情况而定,可能会有几个唤醒,但只有一个会真正获得连接)。因此,您需要在listen之后、但在accept之前派生多个子代。在处理完请求后,子进程返回到accept而不是exit。处理(1)和(2)。

(3)难度较大。您需要某种形式的IPC。通常,您会有一个父进程,它只管理适当数量的子进程。您的子进程需要使用IPC来告诉父进程它们有多忙。然后,父进程可以派生更多的子进程(进入上面的accept循环),或者向子进程发送信号,让它们完成并退出。它还应该处理针对儿童的wait,处理意外死亡等。

您要使用的IPC可能是共享内存。您的两个选项是SysV (shmget) and POSIX (shm_open`)共享内存。如果可用,您可能需要后者。您必须处理同步访问( POSIX和SysV都提供了信号量来帮助实现这一点,最好还是使用POSIX),或者只使用原子访问。

(您可能不希望某个进程在有超过X个空闲子进程时立即退出,这将导致重复获取和生成它们,这是很昂贵的。相反,您可能希望了解它们在过去一秒内的使用情况……因此,您的数据比正在使用/空闲的位图更复杂。)

有很多守护进程都是这样工作的,所以您可以很容易地找到代码示例。当然,如果你去看看Apache,你可能会发现它更复杂,获得良好的性能和随处可移植。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16286208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档