linux 访问共享内存,Linux下的共享内存(03)---通过指针访问共享内存中的数据...
環(huán)境:Vmware Workstation;CentOS-6.4-x86_64
說明:
1、將共享內(nèi)存掛載至進(jìn)程:void? *shmat(int? shmid, const void *shmaddr,int shmflg);
參數(shù)shmid是要附加的共享內(nèi)存區(qū)標(biāo)示符。
總是把參數(shù)shmaddr設(shè)為0。
參數(shù)shmflg可以為SHM_RDONLY,這意味著附加段是只讀的。
shmat成功返回被附加了段的地址,失敗返回-1,并設(shè)置errno。
2、將附在共享內(nèi)存上的進(jìn)程分離:int shmdt(const void *shmaddr);
參數(shù)必須是掛在函數(shù)返回的指針。這個(gè)地址必須是shmat返回的。
圖解說明:
程序:
實(shí)現(xiàn)一個(gè)進(jìn)程修改共享內(nèi)存中的數(shù)據(jù),另一個(gè)進(jìn)程讀取共享內(nèi)存中的數(shù)據(jù)。
步驟:
1、創(chuàng)建并編寫makefile文件:
.SUFFIXES:.c .o
CC=gcc
SRCS1=main1.c
OBJS1=$(SRCS1:.c=.o)
EXEC1=main1
SRCS2=main2.c
OBJS2=$(SRCS2:.c=.o)
EXEC2=main2
start: $(OBJS1) $(OBJS2)
$(CC) -o $(EXEC1) $(OBJS1)
$(CC) -o $(EXEC2) $(OBJS2)
@echo "--------------------------OK------------------------"
.c.o:
$(CC) -Wall -o $@ -c $<
clean:
rm -rf $(OBJS1) $(EXEC1)
rm -rf $(OBJS2) $(EXEC2)
2、通過前面的一個(gè)筆記創(chuàng)建一塊共享內(nèi)存。
[negivup@negivup mycode]$ ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 229381 negivup 666 1024 0
3、創(chuàng)建并編寫源文件main1.c:
#include #include #include #include int main(int argc, char *args[])
{
// 將進(jìn)程依附到共享內(nèi)存上
// 第一個(gè)參數(shù)是共享內(nèi)存的shmid,第二個(gè)參數(shù)和第三個(gè)參數(shù)都是0
// 函數(shù)的返回值是一個(gè)指向共享內(nèi)存的地址,指針類型是void*
void *p_temp = shmat(229381, 0, 0);
// 轉(zhuǎn)換指針的類型根據(jù)要寫入共享內(nèi)存的數(shù)據(jù)類型而定
char *p = (char*)p_temp;
// 將字符串拷貝至共享區(qū)
strcpy(p, "hello\n");
// 將進(jìn)程從共享內(nèi)存上剝離,傳遞的參數(shù)是shmat返回的地址
shmdt(p);
return 0;
}4、創(chuàng)建并編寫源文件main2.c:
#include #include #include #include int main(int argc, char *args[])
{
// 將進(jìn)程依附到共享內(nèi)存上
// 第一個(gè)參數(shù)是共享內(nèi)存的shmid,第二個(gè)參數(shù)和第三個(gè)參數(shù)都是0
// 函數(shù)的返回值是一個(gè)指向共享內(nèi)存的地址,指針類型是void*
void *p_temp = shmat(229381, 0, 0);
// 轉(zhuǎn)換指針的類型根據(jù)要讀取的共享內(nèi)存的數(shù)據(jù)類型而定
char *p = (char*)p_temp;
// 將讀取的內(nèi)容顯示到屏幕
printf("%s", p);
// 將進(jìn)程從共享內(nèi)存上剝離,傳遞的參數(shù)是shmat返回的地址
shmdt(p);
return 0;
}
5、編譯并執(zhí)行程序:
[negivup@negivup mycode]$ make
gcc -Wall -o main1.o -c main1.c
gcc -Wall -o main2.o -c main2.c
gcc -o main1 main1.o
gcc -o main2 main2.o
--------------------------OK------------------------
[negivup@negivup mycode]$ main1 main1是向共享內(nèi)存中寫入數(shù)據(jù)
[negivup@negivup mycode]$ main2 main2是從共享內(nèi)存中讀取數(shù)據(jù)
hello
PS:根據(jù)傳智播客視頻學(xué)習(xí)整理得出。
總結(jié)
以上是生活随笔為你收集整理的linux 访问共享内存,Linux下的共享内存(03)---通过指针访问共享内存中的数据...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql中文注入_SQL注入之Mysq
- 下一篇: 没有bug队——加贝——Python 5