使用了自己做的通用api函式庫,參考之前的文章:
網路程式設計中的select實現超時檢測和通用api
多程序+共享記憶體+訊號量綜合例項
客戶端
#include "comsocket.h"
#include
void handle(int signum) }
int main()
; int datalen = 10;
int outlen = 1024;
int con_fd;
int i,j;
int proc_num,loop_num;
pid_t pid;
printf("input the procnum:\n");
scanf("%d",&proc_num);
printf("input the loop_num:\n");
scanf("%d",&loop_num);
signal(sigpipe,sig_ign);
signal(sigchld, handle);
//客戶端環境初始化
ret = sckclient_init(&handle,5,5,5,1);
for(i = 0;i < proc_num;i++)
break;
}//客戶端端接受報文
ret = sckclient_rcv(handle,con_fd,out, &outlen);
if (ret != 0)
break;
}out[outlen] = '\0';
printf("data: %s \nlen: %d\n", out,outlen);
}close(con_fd);
exit(0);//避免產生孫子程序
}} // 客戶端環境釋放
sckclient_destroy(&handle);
while ((pid = waitpid(-1, null, wnohang) ) >= 0)//返回0的話,表示子程序並沒有真結束完畢,知道返回-1才退出收屍過程,結束父程序。
printf("child over pid %d \n", pid);
fflush(stdout);
return ret;
}
伺服器
#include "comsocket.h"
#include
#define port 8001
#include "myipc_sem.h"
#include "myipc_shm.h"
void chld_handle(int sig)
int srv_init()
//利用獲取的key開啟/建立訊號量集合
key = ftok("./",'a');
//建立訊號量集合--預設建立1個訊號量
//儘管子程序再次呼叫該部分**--表面上重新建立訊號量
//但由於key相同,系統裡面已經有父程序建立的訊號量,所以他們是同乙個訊號量集合
//原理和父子程序建立共享記憶體一樣
ret = sem_open(key, &semid);
if(ret == semerr_enoxist)
}int val= 1;
ret = sem_set(semid, val);//設定訊號量計數值--預設設定第1個,下標位0
if(ret == -1)
ret = sem_get(semid, &val);//獲取訊號量計數值
if(ret != 0)
printf("val:%d\n",val);
return0;}
void test()
} sem_p(semid);//p操作
ret = ipc_creatshm("./", sizeof(int), &shmdl);
if(ret != 0)
ret = ipc_mapshm(shmdl,(void**)&addr);
cnt = ++(*addr);
printf("cnt:%d\n",cnt);
ret = ipc_unmapshm(addr);//顯示解除對映關係
sem_v(semid);//v操作
}int main()
; pid_t pid;
signal(sigchld,chld_handle);
signal(sigpipe,sig_ign);
srv_init();
ret = sckserver_init(port, &listenfd);
if(ret != 0)
printf("waiting for connect.....\n");
while(1)
pid = fork();
if(pid == -1)
else
if(pid == 0)
recv[datalen] = '\0';
printf("rcv:%s\n***************===\n",recv);
test();
//伺服器端傳送報文
ret = sckserver_send(con_fd,recv, datalen, timeout);
if(ret != 0)
}close(con_fd);
exit(ret);
}else
if(pid > 0)
} //伺服器端環境釋放
//ret = sckserver_destroy(void **handle);
return
0;}
客戶端
和多程序版本的一樣,也可以寫成多執行緒版本的!
伺服器
#include "comsocket.h"
#include
#define port 8001
#include "myipc_sem.h"
#include "myipc_shm.h"
#include
void chld_handle(int sig)
int srv_init()
//利用獲取的key開啟/建立訊號量集合
key = ftok("./",'a');
//建立訊號量集合--預設建立1個訊號量
//儘管子程序再次呼叫該部分**--表面上重新建立訊號量
//但由於key相同,系統裡面已經有父程序建立的訊號量,所以他們是同乙個訊號量集合
//原理和父子程序建立共享記憶體一樣
ret = sem_open(key, &semid);
if(ret == semerr_enoxist)
}int val= 1;
ret = sem_set(semid, val);//設定訊號量計數值--預設設定第1個,下標位0
if(ret == -1)
ret = sem_get(semid, &val);//獲取訊號量計數值
if(ret != 0)
printf("val:%d\n",val);
return0;}
void test()
} sem_p(semid);//p操作
ret = ipc_creatshm("./", sizeof(int), &shmdl);
if(ret != 0)
ret = ipc_mapshm(shmdl,(void**)&addr);
cnt = ++(*addr);
printf("cnt:%d\n",cnt);
ret = ipc_unmapshm(addr);//顯示解除對映關係
sem_v(semid);//v操作
}#define time_out 5
void* threadroute(void* var)
; int datalen = 1024;
int timeout = time_out;
int ret = 0;
pthread_detach(pthread_self());
if(var == null)
con_fd = *((int*)var);
free(var);
while(1)
printf("sckserver_rcv err: %d\n",ret);
break;
}recv[datalen] = '\0';
printf("rcv:%s\n***************===\n",recv);
test();
//伺服器端傳送報文
ret = sckserver_send(con_fd,recv, datalen, timeout);
if(ret != 0)
} close(con_fd);
return null;
}int main()
printf("waiting for connect.....\n");
while(1)
int *pcon = (int*)malloc(sizeof(int));
*pcon = con_fd;
//pthread_t *ptr_tid = (pthread_t*)malloc(sizeof(pthread_t));
pthread_create(&tid, null, threadroute, (void*)pcon);
//close(con_fd);
} return
0;}
當然還可以使用」基於select+多執行緒+互斥鎖+共享記憶體」的模式,將pv操作修改為加解鎖即可! Linux簡單高併發模型 Epoll 執行緒池
首先是乙個locker.h的檔案,封裝了訊號量 互斥量 條件變數。locker.h檔案 ifndef locker h define locker h include include include 訊號量的類 class sem locker 銷毀訊號量 sem locker 等待訊號量 bool...
tomcat高併發apr io模型
linux上配置tomcat apr高併發io模型 前情 本人的開發環境 centos7,tomcat8.0.44,jdk1.7.0 79 安裝apr遇到問題 tomcat8.044 需要openssl1.02以上版本 準備條件 必須有網路 安裝gcc gcc 環境 安裝openssl的庫 安裝ap...
C S模型和B S模型
首先了解一下c s和b s模型,b s模型是特殊的c s模型。非對等相互作用,伺服器有客戶端不具備的硬體和軟體資源 運算能力,伺服器提供服務,客戶請求服務。多個客戶程序可以同時訪問乙個服務程序,乙個客戶程序可以同時訪問多個伺服器提供的服務。客戶端和伺服器執行在同乙個機器上,應用於網路應用程式開發測試...