linux下的多进程服务器框架

提示:改編自tinyproxy,向原作者致敬!

在程序的開頭,可以定義以下几個常量:

[Copy to clipboard] [ - ]
CODE:
#defineMAXSERVICES        128       
#define STARTSERVERS 
      32       
#define MAXSPARESERVERS 
      32       
#define MINSPARESERVERS 
           


使用者只需要在程序最下面修改handle_connection函數,在裡面實現對客戶請求的處理邏輯即可,信號處理及進程組控制都由框架完成。在RHES3 2.4kernel和Debian Etch 2.6kernel下測試通過。


歡迎指正。

[Copy to clipboard] [ - ]
CODE:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include



#define MAXLISTEN 
              1024               
#define MAXCLIENTS 
              64                       
#define MAXSERVICES 
              128                       
#define STARTSERVERS 
      32                       
#define MAXSPARESERVERS 
      32                       
#define MINSPARESERVERS 
                           

#define PORT  
                      8000               


int listenfd;  
                             
int received_sighup = 0; 
     
int quit = 0; 
                             

#define SERVER_COUNT_LOCK() 
  _child_lock_wait()
#define SERVER_COUNT_UNLOCK() _child_lock_release()


static struct flock lock_it, unlock_it;
static int lock_fd = -1;

enum child_status_t { T_EMPTY, T_WAITING, T_CONNECTED };

struct child_s {
 
      pid_t tid;
 
      unsigned int connects;
 
      enum child_status_t status;
};


static struct child_s *child_ptr;


static unsigned int* servers_waiting;


static void*
malloc_shared_memory( size_t size )
{
 
      int fd;
 
      void* ptr;
 
      char buffer[32];

 
      static char* shared_file ="/tmp/mps.shared.XXXXXX";

 
      assert( size > 0 );

 
      strncpy( buffer, shared_file, sizeof(buffer));

 
      if ( (fd = mkstemp(buffer)) == -1 )
 
              return (void *)MAP_FAILED;
 
      unlink(buffer);

 
      if (ftruncate(fd, size) == -1)
 
              return (void *)MAP_FAILED;
 
      ptr = mmap( NULL, size, PROT_READ|PROT_WRITE,MAP_SHARED, fd, 0 );

 
      return ptr;
}


static void*
calloc_shared_memory( size_t nmemb, size_t size )
{
 
      void* ptr;
 
      long length;

 
      assert( nmemb > 0 );
 
      assert( size > 0 );

你可能感兴趣的:(服务器类)