99久久全国免费观看_国产一区二区三区四区五区VM_久久www人成免费看片中文_国产高清在线a视频大全_深夜福利www_日韩一级成人av

一口Linux
認(rèn)證:優(yōu)質(zhì)創(chuàng)作者
所在專(zhuān)題目錄 查看專(zhuān)題
Linux庫(kù)概念,動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)的制作,如何移植第三方庫(kù)
關(guān)于線程調(diào)度,你需要了解的幾個(gè)基礎(chǔ)知識(shí)點(diǎn)都在這里了
從概念到代碼,一文了解Linux系統(tǒng)守護(hù)進(jìn)程知識(shí)
如何用C語(yǔ)言操作sqlite3,一文搞懂
linux共享內(nèi)存入門(mén)
一個(gè)線程內(nèi)存泄漏問(wèn)題定位過(guò)程
作者動(dòng)態(tài) 更多
某通信公司筆試題,你會(huì)做幾道?
3天前
10種初學(xué)者最常見(jiàn)的c語(yǔ)言段錯(cuò)誤實(shí)例及原因分析
05-30 12:13
linux系統(tǒng)監(jiān)控工具小神器:btop
05-17 17:37
有沒(méi)有權(quán)貴開(kāi)后門(mén)讓子女做軟件開(kāi)發(fā)人員?
05-10 23:36
一文包你學(xué)會(huì)網(wǎng)絡(luò)數(shù)據(jù)抓包
03-15 09:26

linux共享內(nèi)存入門(mén)

共享內(nèi)存是進(jìn)程間通信中最簡(jiǎn)單的方式之一。共享內(nèi)存允許兩個(gè)或更多進(jìn)程訪問(wèn)同一塊內(nèi)存,就如同 malloc() 函數(shù)向不同進(jìn)程返回了指向同一個(gè)物理內(nèi)存區(qū)域的指針。當(dāng)一個(gè)進(jìn)程改變了這塊地址中的內(nèi)容的時(shí)候,其它進(jìn)程都會(huì)察覺(jué)到這個(gè)更改。

共享內(nèi)存的特點(diǎn):

1)共享內(nèi)存是進(jìn)程間共享數(shù)據(jù)的一種最快的方法。

一個(gè)進(jìn)程向共享的內(nèi)存區(qū)域?qū)懭肓藬?shù)據(jù),共享這個(gè)內(nèi)存區(qū)域的所有進(jìn)程就可以立刻看到其中的內(nèi)容。

2)使用共享內(nèi)存要注意的是多個(gè)進(jìn)程之間對(duì)一個(gè)給定存儲(chǔ)區(qū)訪問(wèn)的互斥。

若一個(gè)進(jìn)程正在向共享內(nèi)存區(qū)寫(xiě)數(shù)據(jù),則在它做完這一步操作前,別的進(jìn)程不應(yīng)當(dāng)去讀、寫(xiě)這些數(shù)據(jù)。

常用函數(shù)

1)創(chuàng)建共享內(nèi)存

所需頭文件:

#include <sys/ipc.h>
#include <sys/shm.h>

int shmget(key_t key, size_t size,int shmflg);

功能:

創(chuàng)建或打開(kāi)一塊共享內(nèi)存區(qū)。

參數(shù):

key:進(jìn)程間通信鍵值,ftok() 的返回值。

size:該共享存儲(chǔ)段的長(zhǎng)度(字節(jié))。

shmflg:標(biāo)識(shí)函數(shù)的行為及共享內(nèi)存的權(quán)限,其取值如下:

IPC_CREAT:如果不存在就創(chuàng)建

IPC_EXCL: 如果已經(jīng)存在則返回失敗

位或權(quán)限位:共享內(nèi)存位或權(quán)限位后可以設(shè)置共享內(nèi)存的訪問(wèn)權(quán)限,格式和 open() 函數(shù)的 mode_t 一樣(open() 的使用請(qǐng)點(diǎn)此鏈接),但可執(zhí)行權(quán)限未使用。

返回值:

成功:共享內(nèi)存標(biāo)識(shí)符。

失敗:-1。

示例代碼如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
 
#define BUFSZ 1024
 
int main(int argc, char *argv[])
{
	int shmid;
	key_t key;
	
	key = ftok("./", 2015); 
	if(key == -1)
	{
		perror("ftok");
	}
	
	//創(chuàng)建共享內(nèi)存
	shmid = shmget(key, BUFSZ, IPC_CREAT|0666);	
	if(shmid < 0) 
	{ 
		perror("shmget"); 
		exit(-1); 
	} 
 
	return 0;
}

運(yùn)行結(jié)果如下:

2)共享內(nèi)存映射

所需頭文件:

#include <sys/types.h>
#include <sys/shm.h>

void *shmat(int shmid, const void *shmaddr, int shmflg);

功能:

將一個(gè)共享內(nèi)存段映射到調(diào)用進(jìn)程的數(shù)據(jù)段中。簡(jiǎn)單來(lái)理解,讓進(jìn)程和共享內(nèi)存建立一種聯(lián)系,讓進(jìn)程某個(gè)指針指向此共享內(nèi)存。

參數(shù):

shmid:共享內(nèi)存標(biāo)識(shí)符,shmget() 的返回值。

shmaddr:共享內(nèi)存映射地址(若為 NULL 則由系統(tǒng)自動(dòng)指定),推薦使用 NULL。

shmflg:共享內(nèi)存段的訪問(wèn)權(quán)限和映射條件( 通常為 0 ),具體取值如下:

0:共享內(nèi)存具有可讀可寫(xiě)權(quán)限。

SHM_RDONLY:只讀。

SHM_RND:(shmaddr 非空時(shí)才有效)

返回值:

成功:共享內(nèi)存段映射地址( 相當(dāng)于這個(gè)指針就指向此共享內(nèi)存 )

失敗:-1

3)解除共享內(nèi)存映射

所需頭文件:

#include <sys/types.h>
#include <sys/shm.h>

int shmdt(const void *shmaddr);

功能:

將共享內(nèi)存和當(dāng)前進(jìn)程分離( 僅僅是斷開(kāi)聯(lián)系并不刪除共享內(nèi)存,相當(dāng)于讓之前的指向此共享內(nèi)存的指針,不再指向)。

參數(shù):

shmaddr:共享內(nèi)存映射地址。

返回值:

成功:0

失敗:-1

4)共享內(nèi)存控制

所需的頭文件:

#include <sys/ipc.h>

#include <sys/shm.h>

int shmctl(int shmid, int cmd, struct shmid_ds *buf);

功能:

共享內(nèi)存屬性的控制。

參數(shù):

shmid:共享內(nèi)存標(biāo)識(shí)符。

cmd:函數(shù)功能的控制,其取值如下:

IPC_RMID:刪除。(常用 )

IPC_SET:設(shè)置 shmid_ds 參數(shù),相當(dāng)于把共享內(nèi)存原來(lái)的屬性值替換為 buf 里的屬性值。

IPC_STAT:保存 shmid_ds 參數(shù),把共享內(nèi)存原來(lái)的屬性值備份到 buf 里。

SHM_LOCK:鎖定共享內(nèi)存段( 超級(jí)用戶 )。

SHM_UNLOCK:解鎖共享內(nèi)存段。

SHM_LOCK 用于鎖定內(nèi)存,禁止內(nèi)存交換。并不代表共享內(nèi)存被鎖定后禁止其它進(jìn)程訪問(wèn)。其真正的意義是:被鎖定的內(nèi)存不允許被交換到虛擬內(nèi)存中。這樣做的優(yōu)勢(shì)在于讓共享內(nèi)存一直處于內(nèi)存中,從而提高程序性能。

buf:shmid_ds 數(shù)據(jù)類(lèi)型的地址(具體類(lèi)型請(qǐng)點(diǎn)此鏈接 ),用來(lái)存放或修改共享內(nèi)存的屬性。

返回值:

成功:0

失敗:-1

實(shí)戰(zhàn)示例

接下來(lái)我們做這么一個(gè)例子:創(chuàng)建兩個(gè)進(jìn)程,在 A 進(jìn)程中創(chuàng)建一個(gè)共享內(nèi)存,并向其寫(xiě)入數(shù)據(jù),通過(guò) B 進(jìn)程從共享內(nèi)存中讀取數(shù)據(jù)。

寫(xiě)端代碼如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
 
#define BUFSZ 512
 
int main(int argc, char *argv[])
{
	int shmid;
	int ret;
	key_t key;
	char *shmadd;
	
	//創(chuàng)建key值
	key = ftok("../", 2015); 
	if(key == -1)
	{
		perror("ftok");
	}
	
	//創(chuàng)建共享內(nèi)存
	shmid = shmget(key, BUFSZ, IPC_CREAT|0666);	
	if(shmid < 0) 
	{ 
		perror("shmget"); 
		exit(-1); 
	}
	
	//映射
	shmadd = shmat(shmid, NULL, 0);
	if(shmadd < 0)
	{
		perror("shmat");
		_exit(-1);
	}
	
	//拷貝數(shù)據(jù)至共享內(nèi)存區(qū)
	printf("copy data to shared-memory\n");
	bzero(shmadd, BUFSZ); // 共享內(nèi)存清空
	strcpy(shmadd, "how are you, mike\n");
	
	return 0;
}

讀端代碼如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
 
#define BUFSZ 512
 
int main(int argc, char *argv[])
{
	int shmid;
	int ret;
	key_t key;
	char *shmadd;
	
	//創(chuàng)建key值
	key = ftok("../", 2015); 
	if(key == -1)
	{
		perror("ftok");
	}
	
	system("ipcs -m"); //查看共享內(nèi)存
	
	//打開(kāi)共享內(nèi)存
	shmid = shmget(key, BUFSZ, IPC_CREAT|0666);
	if(shmid < 0) 
	{ 
		perror("shmget"); 
		exit(-1); 
	} 
	
	//映射
	shmadd = shmat(shmid, NULL, 0);
	if(shmadd < 0)
	{
		perror("shmat");
		exit(-1);
	}
	
	//讀共享內(nèi)存區(qū)數(shù)據(jù)
	printf("data = [%s]\n", shmadd);
	
	//分離共享內(nèi)存和當(dāng)前進(jìn)程
	ret = shmdt(shmadd);
	if(ret < 0)
	{
		perror("shmdt");
		exit(1);
	}
	else
	{
		printf("deleted shared-memory\n");
	}
	
	//刪除共享內(nèi)存
	shmctl(shmid, IPC_RMID, NULL);
	
	system("ipcs -m"); //查看共享內(nèi)存
	
	return 0;
}

運(yùn)行結(jié)果如下:

聲明:本內(nèi)容為作者獨(dú)立觀點(diǎn),不代表電子星球立場(chǎng)。未經(jīng)允許不得轉(zhuǎn)載。授權(quán)事宜與稿件投訴,請(qǐng)聯(lián)系:editor@netbroad.com
覺(jué)得內(nèi)容不錯(cuò)的朋友,別忘了一鍵三連哦!
贊 2
收藏 1
關(guān)注 181
成為作者 賺取收益
全部留言
0/200
成為第一個(gè)和作者交流的人吧
主站蜘蛛池模板: 中日韩一区二区 | 日韩国产在线播放 | 在线观看成人高清a | 伊人黄网| 黄色成人免费视频 | 欧美国产日产观看 | 国产AⅤ爽AV久久久久玉浦团 | 国产99一区二区 | 四虎免看黄 | 国产欧美亚洲精品 | 一二三四在线观看免费中文在线观看 | 久久精品亚洲精品无码金尊 | www.com黄| 日韩免费成人 | 久久久精品91 | 九月婷婷久久 | 国产乱码精品一区二区三区忘忧草 | 亚洲欧美中文日韩av一区 | av蜜桃网 | 国产精品自产拍在线观看 | 91久久艹 | 欧美精品一区二区三区四区 | 色av综合在线 | www.成人在线 | 日本高清不卡的在线 | 宁安如梦40集免费观看 | 亚洲精品视频大全 | 性色AV一区二区三区无码 | 日韩一区二区三区高清免费看看 | 中文字幕色哟哟 | 亚洲男人AV免费影院 | 色多多官网| 噢美一级片 | wwwwwww黄| 国产精品免费视频二三区 | 美丽姑娘免费高清观看 | 狠狠狠的在啪线香蕉亚洲应用 | 无码日韩精品一区二区免费 | 中文字幕无码肉感爆乳在线 | 蜜桃av资源 | 久久99精品久久久久久236 |