如何實現程序間通訊

2021-08-25 02:21:31 字數 1939 閱讀 5823

使用共享記憶體(物理記憶體)的步驟:

1、建立共享記憶體

2、對映到虛擬位址空間

3、把資料寫到共享記憶體

4、解除對映並銷毀

為避免同一時間多個程序訪問同一記憶體,我們必須給共享記憶體加鎖,實現程序同步。

加鎖過程:

1、建立訊號量

2、初始化訊號量

3、進行p操作(拔鑰匙)和v操作(插鑰匙)

4、程式執行結束後銷毀

**段如下:

共享程序一:

#include #include #include #include #include #include #include #define shmkey   1234

#define shmsize 4096 //以頁為單位分配共享記憶體

#define semkey 1234

union semun ;

void sem_p(int semid)

}void sem_v(int semid)

}int main()

semid = semget(semkey, 1, ipc_creat | ipc_excl); //建立訊號量

if (semid == -1)

union semun unsem;

unsem.val = 1; //初始化成二值訊號量

ret = semctl(semid, 0, setval, unsem); //初始化訊號量

if (-1 == ret)

shmaddr = shmat(shmid, null, 0); //對映到虛擬位址空間

if (null == shmaddr)

*(int *)shmaddr = count; //資料寫到共享記憶體

while (1)

printf("process a : count = %d\n", count);

count++;

*(int *)shmaddr = count; //寫回共享記憶體

sem_v(semid); //v操作 加一操作 插鑰匙

} shmdt(shmaddr); //解除對映

shmctl(shmid, ipc_rmid, null);

semctl(semid, 0, ipc_rmid);

return 0;

}

共享程序2:

#include #include #include #include #include #include #include #define shmkey   1234

#define shmsize 4096 //以頁為單位分配共享記憶體

#define semkey 1234

union semun ;

void sem_p(int semid)

}void sem_v(int semid)

}int main()

semid = semget(semkey, 1, 0); //建立訊號量

if (semid == -1)

shmaddr = shmat(shmid, null, 0); //對映到虛擬位址空間

if (null == shmaddr)

while (1)

printf("process b : count = %d\n", count);

count++;

*(int *)shmaddr = count; //寫回共享記憶體

sem_v(semid); //v操作 加一操作 插鑰匙

} shmdt(shmaddr); //解除對映

return 0;

}

程序間通訊是什麼?如何實現程序間的通訊

include intpipe fd 2 匿名管道 include include include include intmain int id fork 建立程序 if id 0 父程序 buf s 0 將讀到的最後乙個字元的後乙個字元設定為 0,方便列印 printf s n buf else ...

程序間通訊如何加鎖

程序間通訊有一種 共享記憶體 方式,大家有沒有想過,這種通訊方式中如何解決資料競爭問題?我們可能自然而然的就會想到用鎖。但我們平時使用的鎖都是用於解決執行緒間資料競爭問題,貌似沒有看到過它用在程序中,那怎麼辦?關於程序間的通訊方式估計大多數人都知道,這也是常見的面試八股文之一。關於程序間通訊方式和優...

android Aidl 實現程序間通訊

1 android 新建aidl 檔案 刪除void basictypes int anint,long along,boolean aboolean,float afloat,double adouble,string astring 這個方法沒用到 還需要實現。2,新增自己需要的方法例如 pac...