1. 程式人生 > >Linux作業系統之程序通訊——利用共享儲存區實現SERVER和 CLIENT的通訊

Linux作業系統之程序通訊——利用共享儲存區實現SERVER和 CLIENT的通訊

實現思路如下:

  • 用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