#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 ...