五、共享記憶體區的寫入和讀出
上面我們介紹了
mmap
函式,下面我們就可以通過這些函式,把程序對映到共享記憶體區。
然後我們就可以通過共享記憶體區進行程序間通訊了。
下面是共享記憶體區寫入的例子:
/*shm_write.h寫入/
讀出共享記憶體區
*/ #include
#include
#include
#include
int main(int argc,char **argv)
shm_id=shm_open(argv[1],o_rdwr|o_creat,0644);/*
建立共享記憶體區
*/ ftruncate(shm_id,100);/*
修改共享區大小
*/ fstat(shm_id,&buf);
ptr=mmap(null,buf.st_size,prot_read|prot_write,map_shared,shm_id,0);/*
連線共享記憶體區
*/ strcpy(ptr,」hello linux」);/*
寫入共享記憶體區
*/ printf(「%s/n」,ptr);/*
讀出共享記憶體區
*/ shm_unlink(argv[1]);/*
刪除共享記憶體區
*/ }
下面是執行結果:
#cc –lrt –o shm_write shm_write.c
#./shm_write test
hello linux
六、程式例子
下面是利用
pisix
共享記憶體區實現程序間通訊的例子:伺服器程序讀出共享記憶體區內容,然後清空。客戶程序向共享記憶體區寫入資料。直到使用者輸入「
q」程式結束。程式用
posix
訊號量實現互斥。
/*server.c
伺服器程式
*/ #include
#include
#include
#include
#include
int main(int argc,char **argv)
shm_id=shm_open(argv[1],o_rdwr|o_creat,0644);/*
建立共享記憶體區
*/ ftruncate(shm_id,100);/*
調整共享記憶體區大小
*/ sem=sem_open(argv[1],o_cread,0644,1);/*
建立訊號量
*/ ptr=mmap(null,100,prot_read|prot_write,map_shared,shm_id,0);/*
連線共享記憶體區
*/ strcpy(ptr,」/0」);
while(1)
sem_unlink(argv[1]);/*
刪除訊號量
*/ shm_unlink(argv[1]);/*
刪除共享記憶體區
*/ }
}/*server.c
伺服器程式
*/ #include
#include
#include
#include
#include
#include
int main(int argc,char **argv)
shm_id=shm_open(argv[1],0);/*
開啟共享記憶體區
sem=sem_open(argv[1],0);/*
開啟訊號量
*/ ptr=mmap(null,100,prot_read|prot_write,map_shared,shm_id,0);/*
連線共享記憶體區
*/ while(1)
exit(0);
}#cc –lrt –o server server.c
#cc –lrt –o user user.c
#./server test&
#./user test
輸入:abc
user:abc
server:abc
輸入:123
user:123
server:123
輸入:q
user:q
Posix多執行緒程式設計學習筆記(六) 共享記憶體(3)
五 共享記憶體區的寫入和讀出 上面我們介紹了 mmap 函式,下面我們就可以通過這些函式,把程序對映到共享記憶體區。然後我們就可以通過共享記憶體區進行程序間通訊了。下面是共享記憶體區寫入的例子 shm write.h寫入 讀出共享記憶體區 include include include includ...
Posix多執行緒程式設計學習筆記(六) 共享記憶體(2)
三 posix 共享記憶體函式 posix 共享記憶體區涉及兩個步驟 1 指定乙個名字引數呼叫 shm open,以建立乙個新的共享記憶體區物件或開啟乙個以存在的共享記憶體區物件。2 呼叫 mmap 把這個共享記憶體區對映到呼叫程序的位址空間。傳遞給 shm open 的名字引數隨後由希望共享該記憶...
Posix多執行緒程式設計學習筆記(六) 共享記憶體(2)
三 posix共享記憶體函式 posix共享記憶體區涉及兩個步驟 1 指定乙個名字引數呼叫shm open,以建立乙個新的共享記憶體區物件或開啟乙個以存在的共享記憶體區物件。2 呼叫mmap把這個共享記憶體區對映到呼叫程序的位址空間。傳遞給shm open的名字引數隨後由希望共享該記憶體區的任何其他...