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

Linux 练习七 (IPC 共享内存)

文章目录

  • System V 共享内存机制:shmget shmat shmdt shmctl
  • 案例一:有亲缘关系的进程通信
  • 案例二:非亲缘关系的进程通信
    • 内存写端write1.c
    • 内存读端read1.c
  • 案例三:不同程序之间的进程通信
    • 程序一,写者shmwr.c
    • 程序二,读者shmre.c

使用环境:Ubuntu18.04
使用工具:VMWare workstations ,xshell

  作者在学习Linux的过程中对常用的命令进行记录,通过思维导图的方式梳理知识点,并且通过xshell连接vmware中ubuntu虚拟机进行操作,并将练习的截图注解,每句话对应相应的命令,读者可以无障碍跟练。第七次练习的重点在于Linux的进程通信之共享内存。
  

System V 共享内存机制:shmget shmat shmdt shmctl

  • 内存共享的原理及实现:
    共享内存本质是一段特殊的内存区域,进程间需要共享的数据被存放在该共享内存区域中,所有需要访问该共享区域的进程都要把共享区域映射 到本进程的地址空间去,不是拷贝。这样一个使用共享内存的进程可以将信息写入空间,而另一个今后才能可以通过对映射地址进行读内存获取刚刚写入的信息,完成进程间通信
  • 共享内存允许一个或多个进程通过同时出现在它们的虚拟地址空间的内存进行通信,而这块虚拟内存的页面被每个共享内存的页表条目所引用,同时并不需要在所有进程的虚拟内存中都有相同的地址。进程对象对于共享内存的访问通过key键值来控制,同时通过key键值来进行访问权限检查。
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
key_t ftok(const char *pathname, int proj_id);
int shmget(key_t key, int size, int shmflg);
void *shmat(int shmid, const void *shmaddr, int shmflg);
int shmdt(const void *shmaddr);
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
  • 函数ftok(const char *pathname, int proj_id);用于创建一个关键字,可以用此key关联一个共享内存段
  1. 参数pathname为一个全路径文件名,此文件必须可访问。
  2. 参数proj_jd通常传入一非0字符
  3. 通过pathname和proj_id组合可以创建唯一的key
  4. 如果调用成功,返回一个关键字key,否则返回-1
  • 函数shmget(key_t key, int size, int shmflg);用于创建或打开一共享内存段,该内存段由函数的第一个参数唯一创建。
  1. 创建成功返回唯一的共享内存标识号(类似于进程号),否则返回-1
  2. 参数key是一个共享内存关联的关键字,如果该key已经关联共享内存,则返回内存段标志,表示打开了此内存段。如果该key不存在,则创建一个新的共享内存段。key 的值既可以用 ftok 函数产生,也可以是 IPC_PRIVATE(用于创建一个只属于创建进程的共享内存,主要用于父子通信),表示总是创建新的共享内存段。
  3. 参数size指定共享内存段的大小,以字节为单位。
  4. 参数shmflg是掩码合成纸,可以是访问权限值与(IPC_CREAT 或 IPC_EXCL)的合成。IPC_CREAT 表示如果内存段不存在就创建。IPC_EXCL 表示如果该内存段存在,则函数返回失败结果(-1)。如果调用成功,返回内存段标识,否则返回-1
  • 函数*shmat(int shmid, const void *shmaddr, int shmflg);将共享内存段映射到进程空间的某一地址。
  1. 参数shmid是共享内存段的标识,通常应该是shmget的成功返回值,即共享内存标识号
  2. 参数shmaddr制定的是共享内存连接到当前进程汇总的地址位置。通常是是NULL,表示让系统来选择共享内存出现的地址。
  3. 参数shmflg是一组位标识,指定 shmget 函数的动作,比如传入 IPC_CREAT 表示要创建新的共享内存,通常为0。
  4. 如果函数调用成功,返回映射后的进程空间的首地址,否则返回(char *)-1。
  • 函数shmdt(const void *shmaddr);用于将共享内存段与进程空间分离。
  1. 参数shmaddr通常为shmat的成功返回值,即映射后的进程空间首址。
  2. 函数成功后返回0,失败后返回-1。
  3. 将共享内存分离并不是真的删除,只是使得该共享内存对当前进程不可再用。
  • 函数shmctl(int shmid, int cmd, struct shmid_ds *buf是共享内存的控制函数,可以用来删除共享内存段。
  1. 参数shmid是共享内存段标识,通常是shmget的成功返回值。
  2. 参数cmd是对共享内存段的操作方式,可选为可选为 IPC_STAT,IPC_SET,IPC_RMID。通常为 IPC_RMID,表示删除共享内存段。
  3. 参数buf是表示共享内存段的信息结构体数据,通常为NULL。
  4. 有进程连接,执行返回0,标记删除成功,但是直到最后一个进程结束连接后,共享内存真正被删除。
  5. 结构体shmid_ds
struct shmid_ds {struct ipc_perm shm_perm; /* Ownership and permissions */size_t shm_segsz; /* Size of segment (bytes) */time_t shm_atime; /* Last attach time */time_t shm_dtime; /* Last detach time */time_t shm_ctime; /* Last change time */pid_t shm_cpid; /* PID of creator */pid_t shm_lpid; /* PID of last shmat(2)/shmdt(2) */shmatt_t shm_nattch; /* No. of current attaches */... 
};
struct ipc_perm {key_t __key; /* Key supplied to shmget(2) */uid_t uid; /* Effective UID of owner */gid_t gid; /* Effective GID of owner */uid_t cuid; /* Effective UID of creator */gid_t cgid; /* Effective GID of creator */unsigned short mode; /* Permissions + SHM_DEST andSHM_LOCKED flags */unsigned short __seq; /* Sequence number */
};

案例一:有亲缘关系的进程通信

#include<stdio.h>
#include<string.h>
#include<errno.h>
#include<unistd.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<stdlib.h>
#include<sys/wait.h>
#define PERM S_IRUSR | S_IWUSR //表示用户可读可写 即 0600int main(int argc,char** argv)
{int shmid = shmget(IPC_PRIVATE,1024,PERM);//只有IPC_PRIVATE情况可以不设置IPC_CREAT,让操作系统来开辟空间if(shmid == -1) {//如果返回的共享内存标识号不为-1,即创建共享内存失败,错误处理fprintf(stderr,"Create Share Memory Error:%s\n\a",strerror(errno));exit(1);}	if(fork() > 0){	//父进程代码char *p_addr = (char*)shmat(shmid,NULL,0);	//将共享内存段地址映射到父进程的进程空间中memset(p_addr,'\0',1024);	//设置这段地址空间初始化为0strncpy(p_addr,"share memory", 1024);//将字符串写入内存printf("父进程id:%d,写入缓冲区:%s\n",getpid(),p_addr);sleep(2);wait(NULL);	//处理结束的进程,防止僵尸进程shmctl(shmid,IPC_RMID,0);//通过唯一的共享内存标识号,删除共享内存exit(0);}else{	//子进程代码sleep(5);	//给父进程留足写数据的时间char* c_addr = (char*)shmat(shmid,NULL,0);	//将共享内存段地址映射到子进程的进程空间中,可以读取其中内容printf("子进程id:%d,进程标识号:%d 读缓冲区内容: %s\n",getpid(),shmid,c_addr);exit(0);}return 0;
}

运行结果:
在这里插入图片描述

案例二:非亲缘关系的进程通信

内存写端write1.c

#include<stdio.h>
#include<string.h>
#include<errno.h>
#include<unistd.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<stdlib.h>
#include<sys/wait.h>int main()
{key_t key = ftok("./file1",1);			//1 写端使用ftok函数获取此文件的唯一关键字if(key == -1){	//获取失败的处理perror("fotk");exit(-1);}int shmid = shmget(key,512,IPC_CREAT|0666);	//2 按照key创建512B大小的共享内存段,返回该共享内存段的标识符if(shmid == -1){	//创建失败的处理perror("shmget");exit(-1);}char *pMap = (char *)shmat(shmid,NULL,0);	//3 获得共享内存段的首地址memset(pMap,'\0',512);strcpy(pMap,"hello world");		//4 想共享内存段中写入内容if(shmdt(pMap) == -1){			//5 关闭共享内存段perror("shmdt");exit(-1);}	return 0;
}

内存读端read1.c

#include<stdio.h>
#include<string.h>
#include<errno.h>
#include<unistd.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<stdlib.h>
#include<sys/wait.h>
int main()
{key_t key = ftok("./file1",1);	//1 读端使用ftok函数获取此文件的唯一关键字if(key == -1){			//获取失败的处理perror("fotk");exit(-1);}int shmid = shmget(key,512,0666|IPC_CREAT);	//2 按照key创建4096大小的共享内存段,权限设可读,返回该共享内存段的标识符if(shmid == -1){	//创建失败的处理perror("shmid");exit(-1);}char* pMap = shmat(shmid,NULL,0);	//3 获取共享内存段的首地址printf("读到的内容:%s\n",pMap);		//4 读取共享内存段的内容if(shmctl(shmid,IPC_RMID,0) == -1){	//5 删除共享内存段,注意和shmdt作区分	perror("shmctl");exit(-1);}return 0;
}

**注意:**如果运行时出错,再运行会出现“错误的参数”、“段错误”等,需要检查共享内存段是否关闭了,可以按如下操作,有可能会出现程序创建了共享内存段,然后没删除的情况,导致想再次运行报错。
在这里插入图片描述
再次运行调试就ok了
在这里插入图片描述

案例三:不同程序之间的进程通信

程序一,写者shmwr.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include<stdlib.h>
#include<sys/wait.h>
struct text
{int useful;	//是否可用的标志char buf[1024];
};int main()
{int shmid = shmget((key_t)5080,sizeof(struct text),0600|IPC_CREAT);//创建唯一key,大小为text的共享内存段,返回唯一内存标识号if(shmid == -1){	//创建失败的处理perror("shmget");exit(-1);}struct text* ptext = (struct text*)shmat(shmid,NULL,0);//获得shmid共享内存段的首地址ptext->useful = 0;while(1){if(ptext->useful == 0){	//判断此内存段是否被用int iret = read(STDIN_FILENO,ptext->buf,1024);	//从标准输入到buf缓冲中,如果read函数不输入会阻塞ptext->useful = 1;	//将缓冲区改为占用状态if(strncmp("end",ptext->buf,3) == 0){	//如果输入的end,则结束break;}ptext->useful = 0; //将缓冲区改为未占用状态,新一次传输}sleep(1);}shmdt((void*)ptext);	//将此进程和共享内存段分离return 0;
}

程序二,读者shmre.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include<stdlib.h>
#include<sys/wait.h>
struct text
{int useful;	//是否可用的标志char buf[1024];
};int main()
{int shmid = shmget((key_t)5080,sizeof(struct text),0600|IPC_CREAT);//创建唯一key,大小为text的共享内存段,返回唯一内存标识号if(shmid == -1){	//创建失败的处理perror("shmget");exit(-1);}struct text* ptext = (struct text*)shmat(shmid,NULL,0);//获得shmid共享内存段的首地址ptext->useful = 0;while(1){if(ptext->useful == 1){write(STDOUT_FILENO,ptext->buf,strlen(ptext->buf));//将缓冲区中的内容打印到标准输出窗口中,如果没有内容write会阻塞ptext->useful = 0;if(strncmp("end",ptext->buf,3) == 0){	//输入end退出循环break;}}sleep(1);}shmdt((void*)ptext);		//将此进程和共享内存段分离shmctl(shmid,IPC_RMID,0);	//清除该进程空间return 0;
}

演示结果,读者结合代码自行体会,end覆盖了内存空间的起始字符,如何修改可以不覆盖呢?
在这里插入图片描述

相关文章:

Linux 练习七 (IPC 共享内存)

文章目录System V 共享内存机制&#xff1a;shmget shmat shmdt shmctl案例一&#xff1a;有亲缘关系的进程通信案例二&#xff1a;非亲缘关系的进程通信内存写端write1.c内存读端read1.c案例三&#xff1a;不同程序之间的进程通信程序一&#xff0c;写者shmwr.c程序二&#xf…...

【数据库原理复习】ch4 完整性约束 SQL定义

这里写目录标题基本概念实体完整性参照完整性违规处理用户自定义完整性约束条件定义完整性约束命名字句基本概念 完整性约束主要包括 实体完整性参照完整性用户自定义完整性 实体完整性 关系模型中实体完整性通常在建表时候添加primary key完成 # primary key定义 create …...

【2023年的就业形势依旧严峻】

2023年口罩放开的第一年&#xff0c;也是第一个招聘会&#xff0c;挤满了求职者和用人单位&#xff0c;大多数都是想着重新开始&#xff0c;抓住金三银四的好时机&#xff0c;找到心仪的工作和符合岗位要求的人才&#xff0c;一起整装出发。我们理想的状态是&#xff0c;经济已…...

Linux下LED灯驱动模板详解

一、地址映射我们先了解MMU&#xff0c;全称是Memory Manage Unit。在老版本的Linux中要求处理器必须有MMU&#xff0c;但是现在Linux内核已经支持五MMU。MMU主要完成的功能如下&#xff1a;1、完成虚拟空间到物理空间的映射2、内存保护&#xff0c;设置存储器的访问权限&#…...

【C++】你不得不爱的——继承

凡是面向对象的语言&#xff0c;都有三大特性&#xff0c;继承&#xff0c;封装和多态&#xff0c;但并不是只有这三个特性&#xff0c;是因为者三个特性是最重要的特性&#xff0c;那今天我们一起来看继承&#xff01; 目录 1.继承的概念及定义 1.概念 2.继承的定义 2.基类…...

数据库系统概论

文章目录前言基础篇&#xff1a;1-5章第 1 章 绪论1.1 数据库系统概述1.2 数据模型1.3 数据库系统的结构1.4 数据库系统的组成1.5 小结第 2 章 关系数据库1.关系模型1.1 关系数据结构1.2 关系完整性约束实体完整性、参照完整性、用户定义完整性2.关系代数8种关系代数运算符并 ∪…...

32位处理器AM6528BACDXEA、AM6548BACDXEAF基于Arm Cortex-A53内核【工业4.0嵌入式产品应用】

AM6528BACDXEA、AM6548BACDXEAF 处理器是专为满足工业4.0嵌入式产品对处理性能的复杂需求而设计的Arm应用处理器。AM654x和AM652x器件将四个或两个Arm Cortex-A53内核与一个双Arm Cortex-R5F MCU子系统结合在一起。这些包含的功能旨在帮助客户实现终端产品的功能安全目标。它还…...

多图片怎么转换成PDF?这招教你轻松转换

多图片怎么转换成PDF&#xff1f;我们经常会传输图片文件给同事或者朋友&#xff0c;但是多张图片的传输比较麻烦&#xff0c;有的时候传输比较慢&#xff0c;而且也不便于查看&#xff0c;所以我们就可以将需要传输的多张图片转换成一个PDF文件&#xff0c;这样查看文件时就可…...

kali双网卡

先单独开启一个网卡&#xff0c;配置/etc/network/interfaces 修改为如下配置 This file describes the network interfaces available on your system and how to activate them. For more information, see interfaces(5). source /etc/network/interfaces.d/* The loopb…...

【wed前端初级课程】第一章 什么是HTML

什么是WEB前端&#xff1f; 简单来说就是网页&#xff0c;只是这个网页它是由多种技术参与制作的&#xff0c;用来向用户展示的页面。 HTML(超文本标签语言)&#xff1a;它决定了网页的结构。 CSS&#xff1a;网页的装饰器。 JavaScript&#xff1a;JavaScrip最初是因为校验…...

sd卡格式化后数据恢复怎么操作

有时候我们需要清空SD卡数据文件&#xff0c;有时候则是因为需要修复SD卡所以需要格式化&#xff0c;但是却被提示无法格式化SD卡。这种情况往往是由于平时SD卡使用时的一些不良习惯或是SD卡中病毒&#xff0c;病毒在运行SD卡中的软件所造成的。那么sd卡格式化后数据恢复怎么操…...

论文阅读笔记|大规模多标签文本分类

多标签文本分类&#xff08;Extreme Multi Label Classification, MLTC&#xff09;是自然语言处理领域中一个十分重要的任务&#xff0c;其旨在从一个给定的标签集合中选取出与文本相关的若干个标签。MLTC可以广泛应用于网页标注&#xff0c;话题识别和情感分析等场景。大规模…...

国际化翻译navigator.language与语种对照表

代码(navigator.language) 语种 字段名 "zh-CN", 中文 Chinese "zh-SG" 马新简体 Chinese_SG "zh-TW","zh-HK", 繁体中文 Chinese_TW "en", "en-US"&#xff08;美国&#xff09;, "en-EG"…...

Matlab进阶绘图第6期—雷达图/蜘蛛图/星图

雷达图&#xff08;Radar Chart&#xff09;&#xff0c;又称星图、蜘蛛图、蜘蛛网图、网络图、Kiviat图等&#xff0c;是一种以从同一点开始的轴上表示的三个以上变量的二维图表的形式&#xff0c;来显示多变量数据的图形方法。 雷达图可以直观地对多维数据集目标对象的性能、…...

Javascript的ES6 class写法和ES5闭包写法性能对比

看到很多闭包写法的函数, 一直怀疑它对性能是否有影响. 还有就是备受推崇的React Hooks函数式写法中出现大量的闭包和临时函数, 我很担心这样会影响性能. 于是, 做了一个实验来做对比. 这个实验很简单, 用md5计算一百万次. 计算过程将结果再放回参数, 这样避免结果没被引用被…...

探秘MySQL——全面了解索引、索引优化规则

文章目录0.什么是索引1.常用索引分类逻辑维度底层数据结构维度物理维度&#xff08;InnoDB&#xff09;2.为什么底层是B树平衡二叉查找树红黑树B树&#xff08;多叉&#xff09;B树&#xff08;多叉&#xff09;3.MySQL索引优化SQL性能分析之explainQ.MySQL如何查看查询是否用到…...

战斗力最强排行榜:10-30人团队任务管理工具

工欲善其事&#xff0c;必先利其器。在高效的任务执行过程中&#xff0c;选择灵活轻便的项目管理工具来提升工作效率、适应快速多变的发展诉求&#xff0c;对团队来说&#xff0c;至关重要。但是如果团队不大&#xff0c;企业对这块的预算又有限&#xff0c;大型的团队任务管理…...

2023-03-09干活小计

强化学习&#xff1a; 强化学习用智能体&#xff08;agent&#xff09;这个概念来表示做决策的机器。 感知、决策和奖励 感知。智能体在…...

基数排序算法

目录&#xff1a;什么是基数排序&#xff1f;基本原理核心思想实现逻辑代码实现复杂度分析总结什么是基数排序&#xff1f; 基数排序&#xff1a;基数排序&#xff08;Radix sort&#xff09;是一种非比较型整数排序算法&#xff0c; 基本思想主要是通过关键字间的比较和移动记…...

项目实战典型案例24——xxljob控制台不打印日志排查

xxljob控制台不打印日志排查一&#xff1a;背景介绍问题截图问题解读二&#xff1a;思路&方案三&#xff1a;过程四&#xff1a;总结一&#xff1a;背景介绍 本篇博客是对xxljob控制台不打印日志排查进行的总结和进行的改进。 目的是将经历转变为自己的经验。通过博客的方…...

旋转框目标检测mmrotate v1.0.0rc1 之RTMDet训练DOTA的官方问题解析整理(四)

关于rotated_rtmdet_l-coco_pretrain-3x-dota_ms.py配置文件的batchsize和学习率设置问题&#xff1a;回答&#xff1a;如何在mmrotate中绘制特征图问题&#xff1a;回答&#xff1a;你好AllieLan&#xff0c;您可以尝试使用https://github.com/open-mmlab/mmyolo/blob/main/de…...

4个顶级的华为/小米/OPPO/Vivo手机屏幕解锁工具软件

有好几次用户发现自己被锁定在他们的华为/小米/OPPO/Vivo设备之外&#xff0c;我们知道这可能是一种非常可怕的体验。在这种情况下&#xff0c;找到安卓手机解锁软件&#xff0c;重新获得手机中重要数据和文件的访问权限。看看这篇文章&#xff0c;因为我们将与您分享什么是解锁…...

华为OD机试题 - 和最大子矩阵(JavaScript)| 机考必刷

更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:和最大子矩阵题目输入输出示例一输入输出说明Code思路版权说明华…...

企业电子招标采购系统源码之项目说明和开发类型

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及…...

Python高频面试题——装饰器(带大家理解装饰器的本质)

装饰器概念装饰器本质上是一个python函数&#xff0c;它可以让其他函数在不需要做任何代码变动的前提下增加额外功能&#xff0c;装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景&#xff0c;比如&#xff1a;插入日志、性能测试、事务处理、缓存、权限验证等场景…...

全方位解读智能中控屏发展趋势!亚马逊Alexa语音+Matter能力成必备

随着智能家居行业逐步从碎片化的智能单品阶段&#xff0c;迈向体验更完整的全屋互联阶段&#xff0c;智能中控屏作为智能家居最佳的入口之一&#xff0c;在年轻人青睐全屋智能装修的风潮下&#xff0c;市场潜力彻底被引爆。 一、为什么是智能中控屏&#xff1f; 在智能音箱增…...

JAVA练习74-括号生成

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 3月10日练习内容 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、题目-…...

Java ORM开发 更全面的应用场景

1. 一个web系统, 想支持多种数据库, 如同时要用mysql, oracle 需要动态切换数据源? 2. 读写分离, 但读库与写库是不同的类型, 如分别是: mysql, oracle 3. 智能化自动过滤null和空字符串&#xff0c;不再需要写判断非空的代码。 4.动态/任意组合查询条件,不需要提前准备da…...

SpringBoot【基础篇】---- 基础配置

SpringBoot【基础篇】---- 基础配置1. 属性配置2. 配置文件分类3. yaml 文件4. yaml 数据读取1. 读取单一数据2. 读取全部数据3. 读取对象数据yaml 文件中的数据引用1. 属性配置 SpringBoot 通过配置文件 application.properties 就可以修改默认的配置&#xff0c;那咱们就先找…...

手机磁吸背夹散热器制冷快速方案

手机散热器是什么&#xff1f;手机散热器分为几种类型&#xff1f;手机散热的方式都有哪些&#xff1f; 因为经常玩游戏&#xff0c;手机发热得厉害&#xff0c;都可以煎鸡蛋了&#xff0c;心想着要买个东西给手机散散热&#xff0c;没想到还真的有手机散热器。 不知道手机散…...

有专业做网站的吗网站公司/传统营销方式有哪些

到目前为此&#xff0c;我们都是用GET方法去请求信息&#xff0c;这一章介绍POST方法&#xff0c;即把信息推送给服务器进行存储和分析。 表单可以帮助用户发出POST请求&#xff0c;当然&#xff0c;通过爬虫创建这些请求提交给服务器 9.1 Python Requests库 Requests库是一个…...

app 微商城网站建设/网站开发框架

因为有很多汉字需要编码所以选择gbkURIEncoding"GBK"/etc/profileexport PATHexport JAVA_HOME/usr/lib/jvm/java-6-sunexport CLASSPATH。:$JAVA_HOME/lib/dt。jar:$JAVA_HOME/lib/tools。jar:$JAVA_HOME/lib/mysql-connector-java-5。1。12-bin。jarumask 022expor…...

大学生帮别人做网站/报个计算机培训班多少钱

???关注微信公众号&#xff1a;【芋艿的后端小屋】有福利&#xff1a; RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表 RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址 您对于源码的疑问每条留言都将得到认真回复。甚至不知道如何读源码也可以请教噢…...

视频直播类网站开发难度/福州seo网络推广

DirectoryEntry是.Net给我们的一大礼物&#xff0c;他的名字我们就知道他的功能--目录入口。使用过ADSI的人都知道操作IIS&#xff0c;WinNT这些时&#xff0c;我们还需要提供他们的Path&#xff0c;操作IIS时&#xff0c;这个Path的格式为&#xff1a;IIS://ComputerName/Serv…...

电子商务公司建设网站方案/seo网站推广方法

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #include #include extern int rand1(void);extern void srand1(int);extern void End();extern void xipai(int *p); //洗牌程序extern void sjsz(int *p,int n); //产生一组n的随即数组&#xff0c;并存储在p【n】数组中…...

合肥百度团购网站建设/广州网站快速排名

MTCNN 级联卷积神经网络的理解Vlog1 一、MTCNN用来干什么&#xff1f; MTCNN是一个检测框架&#xff0c;最初设计的时候&#xff0c;应用在多人脸检测&#xff0c;其实也可以广泛的使用在单类别多目标的场景下&#xff0c;但是应用的场景与其算法的设计有关&#xff0c;在某些…...