程序間通訊 共享記憶體

2021-06-22 10:35:47 字數 3472 閱讀 2185

共享記憶體允許兩個或更多程序共享一塊給定的儲存區,因為資料不需要在不同程序之間訪問,這是最快的一種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...