作業系統實驗2

2021-06-27 15:12:17 字數 4158 閱讀 9353

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編譯器。三 實驗內容 寫出主要的內容 首先用合法使用者登入系統...