精品国产一区在线_av无码中文字幕无码王_天海翼三点刺激高潮不停_好硬好大好爽视频_欧美高清一区三区在线专区_香蕉黄色片

一口Linux
認證:優質創作者
所在專題目錄 查看專題
Linux庫概念,動態庫和靜態庫的制作,如何移植第三方庫
關于線程調度,你需要了解的幾個基礎知識點都在這里了
從概念到代碼,一文了解Linux系統守護進程知識
如何用C語言操作sqlite3,一文搞懂
linux共享內存入門
一個線程內存泄漏問題定位過程
作者動態 更多
iptables -m connlimit導致內存不足
2星期前
為什么對技術人員的考核大多都只看加班時間?
3星期前
某通信公司筆試題,你會做幾道?
07-01 21:58
10種初學者最常見的c語言段錯誤實例及原因分析
05-30 12:13
linux系統監控工具小神器:btop
05-17 17:37

linux共享內存入門

共享內存是進程間通信中最簡單的方式之一。共享內存允許兩個或更多進程訪問同一塊內存,就如同 malloc() 函數向不同進程返回了指向同一個物理內存區域的指針。當一個進程改變了這塊地址中的內容的時候,其它進程都會察覺到這個更改。

共享內存的特點:

1)共享內存是進程間共享數據的一種最快的方法。

一個進程向共享的內存區域寫入了數據,共享這個內存區域的所有進程就可以立刻看到其中的內容。

2)使用共享內存要注意的是多個進程之間對一個給定存儲區訪問的互斥。

若一個進程正在向共享內存區寫數據,則在它做完這一步操作前,別的進程不應當去讀、寫這些數據。

常用函數

1)創建共享內存

所需頭文件:

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

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

功能:

創建或打開一塊共享內存區。

參數:

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

size:該共享存儲段的長度(字節)。

shmflg:標識函數的行為及共享內存的權限,其取值如下:

IPC_CREAT:如果不存在就創建

IPC_EXCL: 如果已經存在則返回失敗

位或權限位:共享內存位或權限位后可以設置共享內存的訪問權限,格式和 open() 函數的 mode_t 一樣(open() 的使用請點此鏈接),但可執行權限未使用。

返回值:

成功:共享內存標識符。

失敗:-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");
	}
	
	//創建共享內存
	shmid = shmget(key, BUFSZ, IPC_CREAT|0666);	
	if(shmid < 0) 
	{ 
		perror("shmget"); 
		exit(-1); 
	} 
 
	return 0;
}

運行結果如下:

2)共享內存映射

所需頭文件:

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

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

功能:

將一個共享內存段映射到調用進程的數據段中。簡單來理解,讓進程和共享內存建立一種聯系,讓進程某個指針指向此共享內存。

參數:

shmid:共享內存標識符,shmget() 的返回值。

shmaddr:共享內存映射地址(若為 NULL 則由系統自動指定),推薦使用 NULL。

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

0:共享內存具有可讀可寫權限。

SHM_RDONLY:只讀。

SHM_RND:(shmaddr 非空時才有效)

返回值:

成功:共享內存段映射地址( 相當于這個指針就指向此共享內存 )

失敗:-1

3)解除共享內存映射

所需頭文件:

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

int shmdt(const void *shmaddr);

功能:

將共享內存和當前進程分離( 僅僅是斷開聯系并不刪除共享內存,相當于讓之前的指向此共享內存的指針,不再指向)。

參數:

shmaddr:共享內存映射地址。

返回值:

成功:0

失敗:-1

4)共享內存控制

所需的頭文件:

#include <sys/ipc.h>

#include <sys/shm.h>

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

功能:

共享內存屬性的控制。

參數:

shmid:共享內存標識符。

cmd:函數功能的控制,其取值如下:

IPC_RMID:刪除。(常用 )

IPC_SET:設置 shmid_ds 參數,相當于把共享內存原來的屬性值替換為 buf 里的屬性值。

IPC_STAT:保存 shmid_ds 參數,把共享內存原來的屬性值備份到 buf 里。

SHM_LOCK:鎖定共享內存段( 超級用戶 )。

SHM_UNLOCK:解鎖共享內存段。

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

buf:shmid_ds 數據類型的地址(具體類型請點此鏈接 ),用來存放或修改共享內存的屬性。

返回值:

成功:0

失敗:-1

實戰示例

接下來我們做這么一個例子:創建兩個進程,在 A 進程中創建一個共享內存,并向其寫入數據,通過 B 進程從共享內存中讀取數據。

寫端代碼如下:

#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;
	
	//創建key值
	key = ftok("../", 2015); 
	if(key == -1)
	{
		perror("ftok");
	}
	
	//創建共享內存
	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);
	}
	
	//拷貝數據至共享內存區
	printf("copy data to shared-memory\n");
	bzero(shmadd, BUFSZ); // 共享內存清空
	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;
	
	//創建key值
	key = ftok("../", 2015); 
	if(key == -1)
	{
		perror("ftok");
	}
	
	system("ipcs -m"); //查看共享內存
	
	//打開共享內存
	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);
	}
	
	//讀共享內存區數據
	printf("data = [%s]\n", shmadd);
	
	//分離共享內存和當前進程
	ret = shmdt(shmadd);
	if(ret < 0)
	{
		perror("shmdt");
		exit(1);
	}
	else
	{
		printf("deleted shared-memory\n");
	}
	
	//刪除共享內存
	shmctl(shmid, IPC_RMID, NULL);
	
	system("ipcs -m"); //查看共享內存
	
	return 0;
}

運行結果如下:

聲明:本內容為作者獨立觀點,不代表電子星球立場。未經允許不得轉載。授權事宜與稿件投訴,請聯系:editor@netbroad.com
覺得內容不錯的朋友,別忘了一鍵三連哦!
贊 2
收藏 1
關注 181
成為作者 賺取收益
全部留言
0/200
成為第一個和作者交流的人吧
主站蜘蛛池模板: 久久久久久久久久久一区 | 2020国自产拍精品露脸快速 | 久久久精华液 | 毛片软件大全 | 日韩三级视频在线播放 | 无收费看污网站 | 拔萝卜视频在线观看 | 欧美福利网 | av蜜臀在线 | 成人一级毛片免费看 | 看片亚洲| 成人性做爰av片免费看 | 日本videoshd | 乱子伦xxxx欧美 | JIZZJIZZ中国高潮喷水JIZJIZ | 高潮A片揉搓乳尖乱颤视频 黄色毛片在线 | 亚洲52av| 国产成人a∨| 国产又粗又硬又黄的视频 | 中文字幕av日韩精品 | 亚洲日韩在线中文字幕第一页 | 外卖员gayxxxxgay2 | tube 18xⅹxxhd indian| 漂亮人妻洗澡被公强 | 中文成人无码精品久久久动漫 | 日韩欧美一区二区在线视频 | 出差少妇被按摩师玩弄了 | 免费看国产精品一二区视频 | 99re免费 | 国产精品国产三级国产aⅴ 狠狠色伊人亚洲综合网 | 久久涩精品| 法国《性迷宫》在线观看 | 在线免费毛片 | 日本人妻仑乱少妇a级毛片 欧美在线视屏 | 中文字幕在线无码一区二区三区 | 亚洲乱码国产乱码精品精天堂 | 欧美人与禽zozzo性伦交 | 高清性爱视频 | 精品深夜AV无码一区二区老年 | 亚洲国产精品成人精品无码区在线 | 久久女人 |