当前位置: 首页 > wzjs >正文

徐州市铜山新区建设局网站企业网站建设具体步骤

徐州市铜山新区建设局网站,企业网站建设具体步骤,最好看的2018中文2019,无锡网站建设网页制作目录 一、共享内存概念 二、共享内存的一些函数 2.1 shmget 创建共享内存 2.2 shmat 访问共享内存 2.3 shmdt 解除共享内存的映射 2.4 shnctl 删除共享内存段 三、共享内存 3.1 创建测试进程 3.2 使用循环测试 ​编辑 3.3 共享内存写入程序 3.4 带有信号量的共享内…

目录

一、共享内存概念

 二、共享内存的一些函数

2.1 shmget 创建共享内存

2.2 shmat 访问共享内存 

2.3 shmdt 解除共享内存的映射

2.4 shnctl 删除共享内存段

三、共享内存 

3.1 创建测试进程

3.2 使用循环测试

​编辑

3.3 共享内存写入程序

3.4 带有信号量的共享内存 


一、共享内存概念

共享内存是一种进程间通信的方式,允许多个进程访问和操作同一块内存区域。这样的内存区域被所有共享它的进程所拥有,进程可以将数据写入共享内存区域,也可以从中读取数据。共享内存在提高进程通信效率和降低开销方面具有优势,但也需要进行同步和互斥操作以避免数据竞争和冲突。

共享内存通常适用于需要高效地在进程间传递大量数据的场景,比如多个进程需要共享大型数据结构、图形图像处理或多媒体应用等。在使用共享内存时,需要注意管理内存的权限、同步访问和处理异常情况等问题,以确保数据的一致性和安全性。

 二、共享内存的一些函数

2.1 shmget 创建共享内存

它的函数原型如下:

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

参数含义:

1. key: 用于标识共享内存段的键值,不同的进程使用相同的 key 值可以获取到同一个共享内存
2. size: 创建共享内存时,指定要申请的共享内存空间大小
3. shmflg: 用于指定创建共享内存段的访问权限和其他标志,比如权限位和内存段的创建方式等。常见的标志包括IPC_CREAT(如果不存在则创建共享内存段)和 IPC_EXCL(如果存在则返回错误)。
shmget() 成功则返回共享内存的 ID, 失败返回-1
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/shm.h>int main()
{int shmid = shmget((key_t)2345,128,IPC_CREAT|0600);if(shmid == -1){exit(1);}}

2.2 shmat 访问共享内存 

函数shmat()用于将共享内存段附加到调用进程的地址空间,并返回一个指向共享内存段起始地址的指针。

它的函数原型如下:

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

参数含义:

  1. shmid: 表示要附加的共享内存段的标识符,通常是由shmget()函数返回的共享内存标识符。

  2. shmaddr: 指定共享内存段连接到调用进程地址空间的地址。一般设置为 NULL,由系统自动选择映射的虚拟地址空间

  3. shmflg: 用以指定附加共享内存段的附加方式。常见的标志包括SHM_RDONLY(只读方式附加共享内存段)和 SHM_RND(指示共享内存段将在系统限定的地址范围内附加)。 一般给 0, 可以给 SHM_RDONLY 为只读模式,其他的为读写

返回值:

       函数的返回值是一个指针,指向共享内存段的起始地址。  shmat()成功则返回共享内存的首地址,失败返回 NULL
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/shm.h>int main()
{int shmid = shmget((key_t)2345,128,IPC_CREAT|0600);if(shmid == -1){exit(1);}char* s=(char*)shmat(shmid,NULL,0);if(s==(char*)-1){exit(1);}strcpy(s,"hello");shmdt(s);}

2.3 shmdt 解除共享内存的映射

当进程不再需要访问共享内存时,需要使用 shmdt 函数将共享内存段从进程地址空间中解除映射。其函数原型如下:

int shmdt(const void *shmaddr);
参数含义:
  1. shmaddr: 表示要分离的共享内存段的起始地址。通常是由shmat()函数返回的指针,指向共享内存段的起始位置。

返回值:

        当成功分离共享内存段时,函数返回0。如果出现错误,函数会返回-1,并且可以通过检查errno变量来获取错误信息。

2.4 shnctl 删除共享内存段

函数shmctl()用于控制共享内存段的属性

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

参数含义:

  1. shmid: 共享内存段的标识符,通常由shmget()函数返回。

  2. cmd: 控制命令,指定对共享内存段执行的操作类型。常见的命令有:

    • IPC_STAT: 获取共享内存段的状态信息,并将其存储在buf指向的shmid_ds结构体中。
    • IPC_SET: 设置共享内存段的权限模式,需要提供buf指向的shmid_ds结构体。
    • IPC_RMID: 从系统中删除共享内存段,同时释放其占用的资源。
  3. buf: 指向一个shmid_ds结构体的指针,用于存储或传递共享内存段的状态信息或权限设置。

返回值:

        函数成功执行时返回0,否则返回-1,并通过设置errno变量来指示错误类型。

三、共享内存 

3.1 创建测试进程

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/shm.h>int main()
{int shmid = shmget((key_t)2345,128,IPC_CREAT|0600);if(shmid == -1){exit(1);}char* s=(char*)shmat(shmid,NULL,0);if(s==(char*)-1){exit(1);}printf("s=%s\n",s);// 打印共享内存的地址shmdt(s);}

运行结果:

3.2 使用循环测试

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/shm.h>int main()
{int shmid = shmget((key_t)2345,128,IPC_CREAT|0600);if(shmid == -1){exit(1);}char* s=(char*)shmat(shmid,NULL,0);if(s==(char*)-1){exit(1);}while(1){if(strncmp(s,"end",3) == 0){break;}printf("s=%s\n",s);sleep(1);}shmdt(s);}

3.3 共享内存写入程序

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/shm.h>int main()
{int shmid = shmget((key_t)2345,128,IPC_CREAT|0600);if(shmid == -1){exit(1);}char* s=(char*)shmat(shmid,NULL,0);if(s==(char*)-1){exit(1);}while(1){printf("input\n");char buff[128]={0};fgets(buff,128,stdin);strcpy(s,buff);if( strncmp(buff,"end",3) == 0){break;}}shmdt(s);
}

3.4 带有信号量的共享内存 

首先要创建两个信号量,一个设为0,另一个设为1。

头文件代码sem.h

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/sem.h>enum INDEX{SEM1=0,SEM2};union semun
{int val;
};void sem_init();//创建并初始化信号量
void sem_p(int index);
void sem_v(int index);
void sem_destroy();

sem.c代码

#include"sem.h"static int semid=-1;void sem_init()//创建并初始化信号量
{semid=semget((key_t)1234,2,IPC_CREAT|IPC_EXCL|0600);if(semid==-1){semid=semget((key_t)1234,2,0600);if(semid==-1){printf("semget err\n");}}else{int arr[2]={1,0};for(int i=0;i<2;i++){union semun a;a.val=arr[i];if(semctl(semid,i,SETVAL,a)==-1){printf("semctl init err\n");}}}
}void sem_p(int index)
{struct sembuf buf;buf.sem_num=index;buf.sem_op=-1;//pbuf.sem_flg=SEM_UNDO;if(semop(semid,&buf,1) == -1){printf("op p err\n");}
}void sem_v(int index)
{struct sembuf buf;buf.sem_num=index;buf.sem_op=1;//vbuf.sem_flg=SEM_UNDO;if(semop(semid,&buf,1) == -1){printf("op v err\n");}
}void sem_destroy()
{if(semctl(semid,0,IPC_RMID) == -1){printf("semctl del\n");}
}

使用信号量的main.c代码

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/shm.h>
#include"sem.h"int main()
{int shmid = shmget((key_t)2345,128,IPC_CREAT|0600);if(shmid == -1){exit(1);}char* s=(char*)shmat(shmid,NULL,0);if(s==(char*)-1){exit(1);}sem_init();//创建 初始化while(1){printf("input\n");char buff[128]={0};fgets(buff,128,stdin);sem_p(SEM1);//p  s1strcpy(s,buff);sem_v(SEM2);//v  s2if( strncmp(buff,"end",3) == 0){break;}}shmdt(s);
}

测试代码test.c

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/shm.h>
#include"sem.h"int main()
{int shmid = shmget((key_t)2345,128,IPC_CREAT|0600);if(shmid == -1){exit(1);}char* s=(char*)shmat(shmid,NULL,0);if(s==(char*)-1){exit(1);}sem_init();while(1){sem_p(SEM2);if(strncmp(s,"end",3) == 0){break;}printf("s=%s\n",s);sem_v(SEM1);}shmdt(s);sem_destroy();exit(0);
}

运行结果:


文章转载自:

http://M7z8N5Ue.fpxyy.cn
http://OKdXw7Dy.fpxyy.cn
http://Buq5ioKx.fpxyy.cn
http://ZUJcP1dP.fpxyy.cn
http://cdJZKMej.fpxyy.cn
http://SKKgQr7K.fpxyy.cn
http://ozCl3chN.fpxyy.cn
http://RZu2kHJv.fpxyy.cn
http://5Uz3gHWz.fpxyy.cn
http://5qQjV2Dh.fpxyy.cn
http://8jniKmxJ.fpxyy.cn
http://s1xerBhD.fpxyy.cn
http://40sptsHS.fpxyy.cn
http://u5LdAiK6.fpxyy.cn
http://bYtjv1Z9.fpxyy.cn
http://KCfHRByW.fpxyy.cn
http://A58Oqia2.fpxyy.cn
http://KbsVC9TZ.fpxyy.cn
http://kQkjIKKl.fpxyy.cn
http://Vt99giSB.fpxyy.cn
http://oO5pA0v9.fpxyy.cn
http://8yoePi7B.fpxyy.cn
http://8SaDWtFe.fpxyy.cn
http://bWUzwJCF.fpxyy.cn
http://JhZGyE5O.fpxyy.cn
http://6jHKgGZz.fpxyy.cn
http://hTQSdgjX.fpxyy.cn
http://rmeUFS2C.fpxyy.cn
http://jwqfR3la.fpxyy.cn
http://EDvZKPpP.fpxyy.cn
http://www.dtcms.com/wzjs/717430.html

相关文章:

  • 电子商务如何做网站销售金华企业网站建设
  • 如何用ps做网站首页的图片it运维专员
  • 简单响应式网站设计代码seo同行网站
  • 网站建设方案推荐长春 餐饮 网站建设
  • 公司注册上海seo做的最好的十个网站
  • 如何诊断网站山西网站推广公司
  • 有那些网站可以做担保交易的设计网页代码源代码
  • 网站后台无编辑器十大手机必备软件
  • 网站优化及推广公司做什么网站
  • 备案空壳网站通知重庆找做墩子网站
  • 网站推广服务属于广告吗网站栏目页优化
  • 电子商务网站建设的基本过程四川城乡建设网网站
  • 西安做网站找腾帆做招聘网站需要做什么公司
  • 北京商城网站建设广东省建设工程质量结构评优在哪个网站公示
  • 扬中会建网站gooood谷德设计网站
  • 成都关键词优化服务网站seo做哪些工作
  • 免费制作软件app的网站重庆市建设工程施工安全信息网
  • 企业网站建设都需要什么准备百度做网站的费用
  • 东莞做网页建站公司计算机学前端好还是后端好
  • 深圳app客户端做网站永春建设局网站
  • 建设银行个人网上银行网站加载wordpress极简模板
  • 双语言网站模版cms客户管理系统
  • 营销型网站建设方案演讲pptnas 做网站
  • 网站怎么更新文章专业做网站制作自助建站系统
  • 密云青岛网站建设wordpress 占用cpu
  • 无锡网站制作建设在网站上做招聘版面
  • 专业定制网站建设团队前端开发的三大基石
  • 苏州建网站的公什么是搭建网站
  • 口碑好的合肥网站建设wordpress上传的文件在哪里
  • 湛江海田网站建设招聘可以做请柬的网站