linux下多程序服務框架

2021-04-13 02:18:42 字數 4309 閱讀 3934

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

歡迎指正。

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

/* * 福瑞哈哥改編自tinyproxy

*/#define maxlisten 1024 /* 最大監聽數,listen函式用 */

#define maxclients 64 /* 最大服務程序數 */

#define maxservices 128 /* 每乙個程序最大服務使用者數,定期更新程序組,防止錯誤積累 */

#define startservers 32 /* 初始啟動服務程序數 */

#define maxspareservers 32 /* 最大空閒服務程序數 */

#define minspareservers 8 /* 最小空閒服務程序數 */

#define port  8000 /* 監聽埠號 */

/* 全域性變數區 */

int listenfd;  /* 服務socket */

int received_sighup = 0; /* 收到hup訊號標誌 */

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 ;

struct child_s ;

/* * 子程序陣列-位於共享記憶體區 

*/static struct child_s *child_ptr;

/** 正等待使用者連線的服務程序數

*/static unsigned int* servers_waiting;

/** 分配一塊共享記憶體。

*/static void*

malloc_shared_memory( size_t size )

/** 分配一塊共享記憶體,並清0。

*/static void*

calloc_shared_memory( size_t nmemb, size_t size )

static void

_child_lock_init(void)

static void

_child_lock_wait(void)

}static void

_child_lock_release(void)

#define server_inc() do  while (0)

#define server_dec() do  while (0)

/** 建立監聽socket

*/static void 

start_listen_socket( unsigned short port )

if ( listen( sockfd, maxlisten ) < 0 ) 

listenfd = sockfd;

}void

close_listen_socket(void)

/** 在這個函式中,寫下對客戶請求的處理邏輯。

* 處理完成後在退出這個函式時,關閉connfd。

*/void 

handle_connection( int connfd );

/** 子程序主迴圈

*/static void

child_main( struct child_s* ptr )

ptr->connects = 0;

while ( !quit ) 

ptr->status = t_connected;

server_dec();

handle_connection( connfd );

ptr->connects++;

if ( ptr->connects == maxservices ) 

server_count_lock();

if ( *servers_waiting > maxspareservers )  else 

server_inc();

}ptr->status = t_empty;

free( cliaddr );

exit(0);}/*

* fork乙個子程序並啟動child_main()函式(子程序主迴圈)

*/static int

child_make( struct child_s* ptr )

int 

child_pool_create(void)

servers_waiting = (unsigned int*) 

malloc_shared_memory( sizeof(unsigned int) );

if ( servers_waiting == map_failed ) 

*servers_waiting = 0;

/* 在操作servers_waiting變數之前, 建立加鎖檔案 */

_child_lock_init();

int i;

/* 初始化子程序共享陣列 */

for ( i = 0; i < maxclients; i++ ) 

/* fork子程序 */

for ( i = 0; i < startservers; i++ )  else 

}return 0;}/*

* 刪除所有服務程序

*/void

kill_children(void)}/*

* 監控程序主迴圈,它負責把服務程序的數量維持在乙個合適的數量上。

*/void 

child_main_loop(void)

server_inc();

break;}}

} else 

sleep(5);

if ( received_sighup ) }}

/** 處理訊號

*/void

takesig( int sig )

return;

}int 

main( int argc, char ** argv )

/* 啟動服務socket */

start_listen_socket( port ); 

signal( sigpipe, sig_ign );

/* 建立服務程序組 */

child_pool_create();

/* * 下面這些訊號處理函式只有監控程序才有用

*/signal( sigchld, takesig );

signal( sigterm, takesig );

signal( sighup, takesig );

/* 開始監控工作 */

child_main_loop();

/* 退出前,殺掉服務程序組 */

kill_children();

/* 關閉服務socket */

close_listen_socket();

exit(0);

return 0;}/*

* 在這個函式中,寫下對客戶請求的處理邏輯。

* 處理完成後在退出這個函式時,關閉connfd。

* 這只是乙個示例!

*/void 

handle_connection( int connfd )

;sprintf( buf, "%u: ", (unsigned int) getpid() );

int len = strlen(buf);

read( connfd, buf + len, sizeof(buf) - len - 1 );

len = strlen(buf);

write( connfd, buf, len );

close( connfd );

}

多程序框架

今天早晨上班的路上突然想到chromium的多程序實現,我們分析可以知道,chrome介面上面你看到的所有所有視窗都是在同乙個主程序裡面建立的,但是tab對應的網頁的渲染卻不是在這個程序裡面做的。我突然想到了另外一種實現,我們每天對著的windows自己的視窗 比如資源管理器,工作列都是在explo...

linux 下多程序的同步

linux 多程序的同步 linux多程序我實現同步操作,操作單個訊號量已經不能實現,對多程序的通訊可以採取訊號集的方式,乙個訊號集包含了多個訊號量。首先通過semget 建立訊號量。例如 semid semget semkey,2,0600 iflags 然後對訊號集中各個訊號量賦初值 semct...

Linux下的多程序程式設計

linux下乙個程序在記憶體裡有三部份的資料,就是 資料段 堆疊段 和 段 其實學過組合語言的人一定知道,一般的cpu象i386,都有上述三種段暫存器,以方便作業系統的執行。段 顧名思義,就是存放了程式 的資料,假如機器中有數個程序執行相同的乙個程式,那麼它們就可以使用同一 個 段。堆疊段存放的就是...