共享記憶體允許兩個或更多程序共享一塊給定的儲存區,因為資料不需要在不同程序之間訪問,這是最快的一種ipc
,傳輸資訊量很大,通過記憶體空間對映程序空間實現,若伺服器程序正在將資料放入共享儲存區,則在它做完這一操作之前,客戶程序不應取這些資料,通常訊號量用來實現對共享儲存訪問的同步。
核心為每個共享儲存段設定了乙個shmid_ds
結構。
struct shmid_ds
len = atoi( argv[2] ); //第二個引數作為儲存區大小而已
flag = ipc_creat;
if( ( semid = semget( ftok( argv[1], 'a' ), len, flag ) ) == -1 )
printf( "\nthe semid = %d\n", semid );
int dis;
struct shmid_ds buff[10];
if( ( dis = shmctl( semid, ipc_stat, buff ) ) == -1 )
return 0 ;
}下面程式,實現的是多個生產者和多個消費者對n
個緩衝區進行訪問的例子
// 生產者
#include #include #include #include #include #include #include #include #include #include #define maxshm 5 //定義緩衝區變數數目
union semun ;
int main ()
shmid = shmget( ipckey, 1024, ipc_creat | 0666 );
if( shmid == -1 )
addr_c = ( char * )shmat( shmid, null, 0 );
if( *( ( int * )addr_c ) == -1 )
//對訊號量處理
struct sembuf p, v; //p ,v操作
union semun arg1, arg2, arg3;
semkey = ftok( "/tmp/linux/sem", 368 );
if( semkey == -1 )
semid = semget( semkey, 3, ipc_creat | 0666 ); //建立訊號量集合
if( semid < 0 )
//依次設定訊號量
arg1.val = 0; //緩衝區無資料,( 即訊號滿 )
if( semctl( semid, 0, setval, arg1 ) == -1 ) //設定value = arg1 = 0
arg2.val = maxshm; // 緩衝區 5 個空閒元素
if( semctl( semid, 1, setval, arg2 ) == -1 ) // 設定value == arg2 = 5
arg3.val = 1; //這個相當於是互斥使用緩衝區
if( semctl( semid, 2, setval, arg3 ) == -1 )
p.sem_num = 0;
p.sem_op = -1; // 注意:sembuf p的操作是 -- 操作( 就是-1處理 )
p.sem_*** = sem_undo;
v.sem_num = 0;
v.sem_op = 1; //注意:sembuf v的操作是 ++ 操作( 就是+1處理 )
v.sem_*** = sem_undo;
while( i < 10 )
sleep( 60 );
// 退出共享區失敗
if( shmdt( addr_c ) == -1 )
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// 刪除共享區
if( shmctl( shmid, ipc_rmid, null ) == -1 )
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// 刪除訊號集
// 消費者
#include #include #include #include #include #include #include #include #include #define maxshm 5
union semun ;
int main ( )
shmid = shmget( ipckey, 1024, ipc_excl | 0666 );
if( shmid == -1 )
addr_c = ( char * )shmat( shmid, null, 0 );
if( *( ( int * ) addr_c ) == -1 )
// p v訊號量操作
struct sembuf p, v;
semkey = ftok( "/tmp/linux/sem", 368 );
if( semkey == -1 )
semid = semget( semkey, 0, ipc_excl | 0666 );
// 在「生產者」中已經建立了,所以此處只要引用就好,所以第二引數0
if( semid < 0 )
p.sem_num = 0;
p.sem_op = -1; // 減去1操作
p.sem_*** = sem_undo;
v.sem_num = 0;
v.sem_op = 1; // 加上1操作
程序間通訊 共享記憶體
下面是自己寫的乙個簡單的共享記憶體的程序間通訊的例子。共享記憶體是用於程序間大量資料共享的一種方法。include include include include include include int main if buf1 shmat shmid,0,0 void 1 strcpy buf1,...
程序間通訊 共享記憶體
共享記憶體是被多個程序共享的一部分物理記憶體。共享記憶體是程序間共享資料的一種最快的方式,乙個程序向共享記憶體區域寫入資料,共享這個記憶體區域的所有程序就可以立刻看到其中的內容。共享記憶體實現分兩個步驟 建立共享記憶體,使用shmget函式 對映共享記憶體,使用shmat函式 共享記憶體是一種最為高...
共享記憶體 程序間通訊
讀程序 include include include include include include include include shm com.h int main void 對映共享記憶體 shared memory shmat shmid,void 0,0 if shared memor...