一 共享內存
共享內存是由IPC為進程創建的一個特殊的地址范圍,它將出現在該進程的地址空間中。其他進程可以將同一段共享內存連接到它們自己的地址空間中,所有進程都可以訪問共享內存中的地址。如果某個進程向共享內存寫入了數據,所做的改動將立刻被可以訪問同一段共享內存的任何其他進程看到。
二 相關函數
#include <sys/shm.h>
/
/
shmget創建共享內存
int
shmget(key_t key, //為共享內存段命名
size_t size, //以字節為單位指定需要共享的內存容量
int
shmflg //權限標志。允許一個進程創建的共享內存可以被共享內存的創建者所擁有的進程寫入,同時其他用戶創建的進程只能讀取該共享內存。
); //如果共享內存創建成功,返回一個非負整數,即共享內存標識符,如果失敗,就返回-1
//shmat將共享內存連接它在程序進入臨界區域時設置信號量到一個進程的地址空間中
void
*shmat(
int
shm_id, //由shmget返回的共享內存標識符
const
void
*shm_addr, //指定的是共享內存連接到當前進程中的地址位置,它通常是一個空指針,表示讓系統來選擇共享內存出現的地址
int
shmflg //一組位標志。通常設為0,讓系統來選擇一個地址,否則就會使應用程序對硬件的依賴性過高
); //如果調用成功,返回一個指向共享內存第一個字節的指針,如果失敗,返回-1
//shmctl控制共享內存
int
shmctl(
int
shm_id, //shmget返回的共享內存標識符
int
cmd, //要采取的動作,可以取3個值: IPC_STAT,IPC_SET,IPC_RMID
struct
shmid_ds *
buf //是一個指向包含共享內存模式和訪問權限的結構
); //成功時返回0,失敗時返回-1
//shmdt將共享內存從當前進程中分離
int
shmdt(
const
void
*
shm_addr); //參數是shmat返回的地址指針。成功時返回0,失敗時返回-1
?shmctl中第二個參數的取值:
IPC_STAT:把shmid_ds結構中的數據設置為共享內存的當前關聯值
IPC_SET:如果進程有足夠的權限,就把共享內存的當前關聯值設置為shmid_ds結構中給出的值
IPC_RMID:刪除共享內存段
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);
}
//
現在可以讓程序訪問這個共享內存
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);
}
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

