Linux作業系統之程序通訊——利用共享儲存區實現SERVER和 CLIENT的通訊
阿新 • • 發佈:2018-12-15
實現思路如下:
- 用fork( )建立子程序,利用共享儲存區實現SERVER和 CLIENT的通訊
- SERVER建立一個KEY為75的共享區: 若共享區的第一個位元組為-1 ,則表示空閒。
- 若共享區的第一個位元組為-1 ,則表示空閒。
- 若該位元組值發生變化,則表示收到了訊息,讀取後再次把值設為-1。
- SERVER每接收到一次資料後顯示“(server)received”。
- 若遇到的值為0,則視為結束訊號,取消該佇列,並退出。
- CLIENT端建立一個為75的共享區:
- 若共享區的第一個位元組為-1, 則表示該單元空閒,可傳送請求
- CLIENT 隨即填入9到0,期間等待Server端再次空閒。
- CLIENT每傳送一次資料後顯示“ (client)sent”。
- 進行完這些操作後, CLIENT退出。
詳細程式碼如下:
#include<sys/types.h> #include<sys/msg.h> #include<sys/ipc.h> #define SHMKEY 75 /*定義共享區關鍵詞*/ void CLIENT() { int shmid,i; int *addr; shmid=shmget(SHMKEY,1024, 0777|IPC_CREAT); /*獲取共享區,長度1024,關鍵詞SHMKEY*/ addr=shmat(shmid,0,0); /*共享區起始地址為addr*/ for(i=9;i>=0;i--) { while(*addr!= -1); printf("(client)sent\n"); *addr=i; /*把i賦給addr*/ } exit(0); } void SERVER() { int shmid; int *addr; shmid=shmget(SHMKEY,1024,0777|IPC_CREAT); /*建立共享區*/ addr=shmat(shmid,0,0); /*共享區起始地址為addr*/ *addr=-1; do { while(*addr ==-1); printf("(server)received\n%d",*addr); if(*addr!=0) *addr=-1; } while(*addr!=0); wait(0); shmctl(shmid,IPC_RMID,0); } void main() { if(fork()) { SERVER(); }else { CLIENT(); } }
END