一 共享內(nèi)存
共享內(nèi)存是由IPC為進(jìn)程創(chuàng)建的一個(gè)特殊的地址范圍,它將出現(xiàn)在該進(jìn)程的地址空間中。其他進(jìn)程可以將同一段共享內(nèi)存連接到它們自己的地址空間中,所有進(jìn)程都可以訪問(wèn)共享內(nèi)存中的地址。如果某個(gè)進(jìn)程向共享內(nèi)存寫(xiě)入了數(shù)據(jù),所做的改動(dòng)將立刻被可以訪問(wèn)同一段共享內(nèi)存的任何其他進(jìn)程看到。
二 相關(guān)函數(shù)
#include <sys/shm.h>
/
/
shmget創(chuàng)建共享內(nèi)存
int
shmget(key_t key, //為共享內(nèi)存段命名
size_t size, //以字節(jié)為單位指定需要共享的內(nèi)存容量
int
shmflg //權(quán)限標(biāo)志。允許一個(gè)進(jìn)程創(chuàng)建的共享內(nèi)存可以被共享內(nèi)存的創(chuàng)建者所擁有的進(jìn)程寫(xiě)入,同時(shí)其他用戶(hù)創(chuàng)建的進(jìn)程只能讀取該共享內(nèi)存。
); //如果共享內(nèi)存創(chuàng)建成功,返回一個(gè)非負(fù)整數(shù),即共享內(nèi)存標(biāo)識(shí)符,如果失敗,就返回-1
//shmat將共享內(nèi)存連接它在程序進(jìn)入臨界區(qū)域時(shí)設(shè)置信號(hào)量到一個(gè)進(jìn)程的地址空間中
void
*shmat(
int
shm_id, //由shmget返回的共享內(nèi)存標(biāo)識(shí)符
const
void
*shm_addr, //指定的是共享內(nèi)存連接到當(dāng)前進(jìn)程中的地址位置,它通常是一個(gè)空指針,表示讓系統(tǒng)來(lái)選擇共享內(nèi)存出現(xiàn)的地址
int
shmflg //一組位標(biāo)志。通常設(shè)為0,讓系統(tǒng)來(lái)選擇一個(gè)地址,否則就會(huì)使應(yīng)用程序?qū)τ布囊蕾?lài)性過(guò)高
); //如果調(diào)用成功,返回一個(gè)指向共享內(nèi)存第一個(gè)字節(jié)的指針,如果失敗,返回-1
//shmctl控制共享內(nèi)存
int
shmctl(
int
shm_id, //shmget返回的共享內(nèi)存標(biāo)識(shí)符
int
cmd, //要采取的動(dòng)作,可以取3個(gè)值: IPC_STAT,IPC_SET,IPC_RMID
struct
shmid_ds *
buf //是一個(gè)指向包含共享內(nèi)存模式和訪問(wèn)權(quán)限的結(jié)構(gòu)
); //成功時(shí)返回0,失敗時(shí)返回-1
//shmdt將共享內(nèi)存從當(dāng)前進(jìn)程中分離
int
shmdt(
const
void
*
shm_addr); //參數(shù)是shmat返回的地址指針。成功時(shí)返回0,失敗時(shí)返回-1
?shmctl中第二個(gè)參數(shù)的取值:
IPC_STAT:把shmid_ds結(jié)構(gòu)中的數(shù)據(jù)設(shè)置為共享內(nèi)存的當(dāng)前關(guān)聯(lián)值
IPC_SET:如果進(jìn)程有足夠的權(quán)限,就把共享內(nèi)存的當(dāng)前關(guān)聯(lián)值設(shè)置為shmid_ds結(jié)構(gòu)中給出的值
IPC_RMID:刪除共享內(nèi)存段
struct
shmid_ds{ uid_t shm_perm.uid; uid_t shm_perm.gid; mode_t shm_perm.mode; }
?
三 例子
shm_com.h
#define
TEXT_SZ 2048
struct
shared_use_st{
int
written_by_you;
char
some_text[TEXT_SZ];
};
shm1.c
#include <unistd.h>
#include
<stdlib.h>
#include
<stdio.h>
#include
<
string
.h>
#include
<sys/shm.h>
#include
"
shm_com.h
"
int
main(){
int
running =
1
;
void
*shared_memory=(
void
*)
0
;
struct
shared_use_st *
shared_stuff;
int
shmid;
srand((unsigned
int
)getpid());
shmid
=shmget((key_t)
1234
,
sizeof
(
struct
shared_use_st),
0666
|
IPC_CREAT);
if
(shmid==-
1
){
fprintf(stderr,
"
shmget failed\n
"
);
exit(EXIT_FAILURE);
}
//
現(xiàn)在可以讓程序訪問(wèn)這個(gè)共享內(nèi)存
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_memory分配給shared_stuff,然后它輸出written_by_you中的文本
shared_stuff=(
struct
shared_use_st *
)shared_memory;
shared_stuff
->written_by_you=
0
;
while
(running){
if
(shared_stuff->
written_by_you){
printf(
"
You wrote:%s
"
,shared_stuff->
some_text);
sleep(rand()
%
4
);
shared_stuff
->written_by_you=
0
;
if
(strncmp(shared_stuff->some_text,
"
end
"
,
3
)==
0
){
running
=
0
;
}
}
}
if
(shmdt(shared_memory)==-
1
){
fprintf(stderr,
"
shmdt failed\n
"
);
exit(EXIT_FAILURE);
}
if
(shmctl(shmid,IPC_RMID,
0
)==-
1
){
fprintf(stderr,
"
shmctl(IPC_RMID) failed\n
"
);
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
shm2.c
#include <stdio.h>
#include
<stdlib.h>
#include
<
string
.h>
#include
<unistd.h>
#include
<sys/shm.h>
#include
"
shm_com.h
"
int
main(){
int
running=
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
){
fprintf(stderr,
"
shmdt failed\n
"
);
exit(EXIT_FAILURE);
}
}
if
(shmdt(shared_memory)==-
1
){
fprintf(stderr,
"
shmdt failed\n
"
);
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

