2、當生產者-消費者分別由位於不同計算機上的若干程序充當時,如何設計實驗?給出設計方案和linux c語言實現(重要語句加上注釋)。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//緙撳啿鍖哄ぇ灝?
#define buffersize 5
//鑾峰彇鐨勪駭鍝佹暟
#define many 12
//鍏變韓鍐呭瓨
struct productbuff productbuff;
// 涓昏姝ラ鏄痵ocket(),bind(),listen(),鍙﹀accept()鏄彇寰楃敵璇瘋€呯殑鏂囦歡鎻忚堪絎︼紝濡傛灉娌℃湁鐢寵榪涗▼錛岄偅涔堣繍琛屽埌閭i噷鏃朵細闃誨錛岀洿鍒版湁鐢寵榪涗▼鍙戣搗閾炬帴
//鐢熶駭鑰呯鍙?
int portnumber;
//鏂囦歡鎻忚堪絎?sockfd鏄湇鍔$殑浣跨敤鐨?newsockfd鏄拡瀵圭敵璇瘋繘紼嬬殑鏂囦歡鎻忚堪絎?
int sockfd, newsockfd;
struct sockaddr_in server_addr,client_addr;
//姣忔璇葷殑闀垮害
int addr_len=sizeof(struct sockaddr_in);
//鍒濆鍖栫繡緇滄湇鍔?
void serverinit()
printf("寤虹珛鏈嶅姟鎴愬姛!\nsocket id:%d\n",sockfd);
bzero(&server_addr,sizeof(struct sockaddr_in));
server_addr.sin_family=af_inet;
server_addr.sin_addr.s_addr=htonl(inaddr_any);
server_addr.sin_port=htons(portnumber);
if(bind(sockfd,(struct sockaddr*)(&server_addr),sizeof(struct sockaddr))==-1)
printf("yes! 榪炴帴鎴愬姛浜? my port:%d\n",portnumber);
if(listen(sockfd,10)==-1)
printf("yes! listening...\n");
}#define sem_key 4009
struct sembuf semaphore;
int semid;
#define mutex 0
#define empty 1
#define full 2
//鍒濆鍖栦俊鍙烽噺
int init()else
}//鍒犻櫎淇″佛閱?
void sigend(int sig)
//鏂板浜у搧
void writeproductbuff(struct productbuff*c,int* value)
//pv錼嶄綔,鐢卞弬鏁皌紜畾鏄鍝竴涓彉閱忚繘琛孭v錼嶄綔,t=0,1,2
void p(int t)
void v(int t)
//鍙栧嚭浜у搧
int readproductbuff(struct productbuff* c)
//閬嶅巻杈撳嚭浜у搧
void overcirclebuf(struct productbuff* c)
printf("\n");
}//鐢熶駭鑰?
void* produce(void *i)
v(mutex);
v(full);}}
//娑堣垂鑰?
void* consume(void* temp)
}else
v(mutex);
v(empty);
} close(*newsockfd);
}int main(int argc,char* argv)
//鑾峰彇瑕佽闂殑絝彛鍙?閫氳繃灝嗚緭鍏ョ殑瀛楃涓茶漿鎹㈡垚闀挎暣褰㈡暟
if((portnumber=atoi(argv[1]))<0)
//緗戠粶閫氫俊鍑嗗
serverinit();
//pv錼嶄綔鍑嗗
while(!init());
signal(sigint,sigend);
signal(sigterm,sigend);
//pro
int i;
pthread_t proid;
printf("寮€宸ョ敓浜?\n");
int *addr_data=(int*)malloc(22*sizeof(int));
//寮€鍚簡20涓敓浜ц€呯嚎紼嬶紝鍏朵腑addr_data鏄紶閫佺粰produce()鍑芥暟鐨勫弬鏁?
for(i=1;i<21;i++)
//絳夊緟榪涗▼榪炴帴,榪炴帴鍚庡悜榪炴帴鐨勮繘紼嬪彂閫佷駭鍝?
while(1)
printf("server get connection from:%s %d\n",inet_ntoa(client_addr.sin_addr),client_addr.sin_port);
pthread_t id;
//newsockfd鏄拡瀵圭敵璇瘋繘紼嬬殑鏂囦歡鎻忚堪絎?
pthread_create(&id,null,consume,&newsockfd);
for(i=0;i<5000000;i++)
sleep(3);
}sleep(8);
close(sockfd);
return 0;
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//鑾峰彇鐨勪駭鍝佹暟
#define many 12
//瀹㈡埛絝?
int main(int argc,char* argv)
if((host=gethostbyname(argv[1]))==null)//鑾峰彇涓繪満,閫氳繃鍩熷悕鎴栦富鏈哄悕鑾峰彇ip鍦板潃
if((port=atoi(argv[2]))<0)//鑾峰彇瑕佽闂殑絝彛鍙?閫氳繃灝嗚緭鍏ョ殑瀛楃涓茶漿鎹㈡垚闀挎暣褰㈡暟
if((sockfd=socket(af_inet,sock_stream,0))==-1)//濂楁帴瀛?
printf("yes! 鍒涘緩榪炴帴鎴愬姛! socket id:%d\n",sockfd);
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family=af_inet;
server_addr.sin_port=htons(port);
server_addr.sin_addr=*((struct in_addr*)host->h_addr);
if(connect(sockfd,(struct sockaddr*)(&server_addr),sizeof(struct sockaddr))==-1)//鑾峰彇鏂囦歡鎻忚堪絎?
int nbytes;
int i=0;
for(i=0;i
buffer[nbytes]='\0';
printf("璇誨靉鐨勪駭鍝佷負:%s\n",buffer);
int j;
for(j=0;j<500000;j++)
sleep(1);
}
close(sockfd);
return 0;
}1-2.1
gcc 1-2.1.c -o 1-2.1 -lpthread
./1-2.1 8080
1-2.2
gcc 1-2.2.c -o 1-2.2 -lpthread
./1-2.2 127.0.0.1 8080
作業系統實驗2
1 訊息的建立,傳送和接受。使用系統呼叫 msgget msgsnd msgrev 及msgctl 編制一長度為1k的訊息傳送和接受的程式。為了便於操作和觀察結果,用乙個程式做為 引子 先後fork 兩個子程序,server 和 client 程序通訊。server 端建立乙個key 為 75 的訊...
Linux作業系統實驗(2)
核心模組的結構 標頭檔案宣告。標頭檔案module.h和init.h是必不可少的。module.h是載入模組所需要的函式和符號定義 init.h中包含初始化和清楚函式的定義。如果載入是允許用 戶傳遞引數,模組還應包括moduleparam.h。模組許可宣告。用module license巨集宣告此模...
作業系統實驗
一 實驗目的 理解vi的三種執行模式及其切方法。學會使用vi的各種操作命令進行文字檔案的編輯。用vi編寫linux下c程式,會用gcc編譯。二 實驗環境 一台裝有linux的機器 這裡預設是red hat linux 9 系統裡面有gcc編譯器。三 實驗內容 寫出主要的內容 首先用合法使用者登入系統...