使用者只需要在程式最下面修改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,都有上述三種段暫存器,以方便作業系統的執行。段 顧名思義,就是存放了程式 的資料,假如機器中有數個程序執行相同的乙個程式,那麼它們就可以使用同一 個 段。堆疊段存放的就是...