ti共享記憶體技術 程序間通訊之共享記憶體

2021-10-19 23:10:55 字數 2156 閱讀 2642

#include #include "shm_com.h"

int main()

int runnint = 1;

void *shared_memory = (void *)0;

struct shared_use_st *shared_stuff;

char buffer[bufsiz];

int shmid;

shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666 | ipc_creat);

if(shmid == -1)

fprintf(stderr, "shmget failed\n");

exit(exit_failure);

shared_memory = shmat(shmid, (void *)0, 0);

if(shared_memory == (void *)-1)

fprintf(stderr, "shmat failed\n");

exit(exit_failure);

printf("memory attached at %x\n", (int)shared_memory);

shared_stuff = (struct shared_use_st *)shared_memory;

while(running)

while(shared_stuff->written_by_you == 1)

sleep(1);

printf("waiting for client...\n");

printf("enter some text: ");

fgets(buffer, bufsiz, stdin);

strncpy(shared_stuff->some_text, buffer, text_sz);

shared_stuff->written_by_you = 1;

if(strncmp(buffer, "end", 3) == 0)

running = 0;

if(shmdt(shared_memory) == -1)

fprintf(stderr, "shmdt failed\n");

exit(exit_failure);

exit(exit_success);

當我們執行這些程式,我們會得到下面的輸出:

$ ./shm1 &

[1] 294

memory attached at 40017000

$ ./shm2

memory attached at 40017000

enter some text: hello

you wrote: hello

waiting for client...

waiting for client...

enter some text: linux!

you wrote: linux!

waiting for client...

waiting for client...

waiting for client...

enter some text: end

you wrote: end

工作原理

第乙個程式,shm1,建立共享記憶體段並其關聯到他的位址空間。我們在共享記憶體的第一部分揭示了shared_use_st結構。這個結構有乙個標

記,written_by_you,當資料可用時會設定這個標記。當設定了這個標記時,程式會讀取文字,輸出文字,並且清除標記來表示程式已經讀取資料

了。我們使用乙個特殊的字串,end,來進行由迴圈中的退出。程式然後分離共享記憶體並且刪除他。

第二個程式,shm2,獲得並關聯共享記憶體段,因為他使用相同的鍵值,1234。然後他提示使用者輸入一些文字。如果設定了written_by_you標

記,shm2就會知道客戶端程式還沒有讀取前面輸入的資料並且進行等待。當其他程序清除了這個標記,shm2會寫入新的資料並且設定標記。他也使用字串

end來結束並分離共享記憶體段。

注意,我們必須提供我們自己的,相當粗糙的同步標記,written_by_you,這會導致乙個低效的忙等待。在實際的程式中,我們會傳遞乙個訊息,或者使用管道,或者使用ipc訊息(我們會在稍後討論),生成資訊,或是使用訊號量來在程式的讀取與寫入部分提供同步。

ti共享記憶體技術 程序間通訊之共享記憶體

include include shm com.h int main int runnint 1 void shared memory void 0 struct shared use st shared stuff char buffer bufsiz int shmid shmid shmget...

程序間通訊之共享記憶體

此程式實現兩個普通程序間通過共享記憶體來進行通訊,共享記憶體能夠進行大資料量的通訊,這一點事訊息佇列無法比擬的。在這裡同時使用了訊號量來保證兩個程序間的讀寫同步。傳送端源 include include include include include include include include ...

程序間通訊之共享記憶體

1.概念 共享記憶體就是多個程序的位址空間對映到同乙個物理記憶體,多個程序都能看到這塊物理記憶體,共享記憶體可以提供給伺服器程序和客戶程序之間進行通訊,不需要進行資料的複製,所以速度最快。2.共享記憶體操作需要的函式 1 我們需要利用ftok函式生成key識別符號。key t ftok const ...