怎样做免费网站的推广做数学题挣钱的网站
- 作者: 五速梦信息网
- 时间: 2026年03月21日 06:45
当前位置: 首页 > news >正文
怎样做免费网站的推广,做数学题挣钱的网站,重庆中色十二冶金建设有限公司网站,龙岗网站制作公司一般多少钱#x1f341;你好#xff0c;我是 RO-BERRY #x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 #x1f384;感谢你的陪伴与支持 #xff0c;故事既有了开头#xff0c;就要画上一个完美的句号#xff0c;让我们一起加油 目录 1. 命名管道2. 创建命名管… 你好我是 RO-BERRY 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 感谢你的陪伴与支持 故事既有了开头就要画上一个完美的句号让我们一起加油 目录 1. 命名管道2. 创建命名管道3.匿名管道与命名管道的区别4. 命名管道的打开规则5. system V 共享内存6. 共享内存的理解7. 共享内存数据结构8. 共享内存函数shmget函数—创建共享内存shmat函数—将共享内存段连接到进程地址空间shmdt函数—将共享内存段与当前进程脱离shmctl函数 —控制共享内存 9. 共享内存通信10. 共享内存的特点 1. 命名管道
管道应用的一个限制就是只能在具有共同祖先具有亲缘关系的进程间通信。如果我们想在不相关的进程之间交换数据可以使用FIFO文件来做这项工作它经常被称为命名管道。命名管道是一种特殊类型的文件 命名管道Named Pipe也称为命名管道文件或FIFOFirst-In-First-Out先进先出队列是一种在操作系统级别创建的特殊类型的文件它允许不同进程间通过文件系统共享数据或通信。在Windows环境中它们通常用于两个进程之间的临时、无服务器的数据交换比如应用程序间的同步或者是服务端向客户端发送信息。 命名管道有以下几个关键特点
双向通信既可以从一端读取数据也可以从另一端写入数据。非阻塞模式支持非阻塞I/O操作提高程序的并发性能。安全隔离默认情况下只有拥有足够权限的进程才能访问命名管道。 2. 创建命名管道
命名管道可以从命令行上创建命令行方法是使用下面这个命令 mkfifo filename mkfifo是Unix/Linux系统中的一个命令行工具全称“Make FIFO”用于创建一个名为“FIFO”Fifo File或“命名管道”Named Pipe。这是一个特殊的文件类型类似于普通文件但它提供了一种半双工的通信机制即数据只能从一端写入另一端读取不能同时双向传输。 当你创建一个FIFO文件时需要指定其路径例如mkfifo /path/to/myfifo。一旦创建其他进程就可以通过这个文件名来读写数据。因为它是基于文件的操作所以权限管理也是按照常规文件来进行的。 FIFOs常用于在同一台机器上不同进程之间的异步通信特别是当通信需求简单且不需要网络连接的情况。它们在守护进程、系统启动脚本或其他需要进程间通信的应用场景中十分常见。
命名管道也可以从程序里创建相关函数有 int mkfifo(const char filename,mode_t mode); 在C语言中它是一个库函数通常在头文件unistd.h中声明。这个函数的主要作用是在当前工作目录下创建一个名为filename的命名管道FIFO并设置其权限模式mode。 filename参数是你要创建的FIFO文件的路径和名称比如 “my_fifo”。mode参数是一个整数包含了文件的访问权限信息如读写权限S_IRWXU、S_IWUSR等位标志组合以及文件所有者和组的权限。这个参数可以根据应用需求调整。 该函数返回一个整数值如果操作成功返回0若失败则返回负值可以检查errno变量获取错误原因。常见的错误包括权限不足、文件已存在或者无法在指定路径创建等。 在Linux下创建一个命名管道名称为fifo如下 当我们向管道文件输入信息的时候命令行会锁住不动这就是证明我们的信息输入在管道里需要我们进行处理了 我们复制会话在另一个窗口将管道信息打印 可以发现左边的命令行恢复正常并且信息被打印在了右边证明信息被输出 我们再采取循环的方式进行打印输出 在这里可以一直输出信息了。 在使用管道的时候我们可以发现管道里无论写入什么其大小一直都是0。 当你向命名管道写入数据时确实会观察到写入的字节数总是显示为0但实际上你已经成功地将数据放入了管道中。这是因为Linux在内部实现了这种特殊的数据结构当你查看标准的write()操作返回值时它并不反映实际的数据长度而是表示是否成功写入管道。 当write()返回0时通常意味着管道已满或者出错而不是真的没有写入任何东西。正确的做法是在读取之前检查返回值和管道的状态比如通过fcntl()或ioctl()函数获取管道的读写指针位置等信息。如果你确认已经写入数据而显示的字节数为0可能需要检查管道的权限、文件描述符状态或是否有其他进程阻塞在读取端。 3.匿名管道与命名管道的区别
匿名管道由pipe函数创建并打开。命名管道由mkfifo函数创建打开用openFIFO命名管道与pipe匿名管道之间唯一的区别在它们创建与打开的方式不同一但这些工作完成之后它们具有相同的语义
匿名管道只能对具有血缘关系的进程进行进程间通信但是命名管道可以让两个毫不相干的进程进行通信这是为什么 匿名管道也叫无名管道是基于内核机制的它的创建是隐式的通常由操作系统自动为其分配一个唯一的ID。因为它们是在父进程和子进程之间创建的所以只能用于父子进程之间的通信这就是所谓的“血缘关系”限制。一旦子进程结束匿名管道也随之消失因此无法支持跨进程的持久化通信。 相比之下命名管道fifo即first-in-first-out队列是预创建的并有一个明确的路径名。当一个进程打开这个命名管道时它就是通过这个名字而不是关联关系来找到管道的。这就使得任何一个拥有权限并知道名称的进程都可以尝试去读取或写入管道即使这些进程彼此没有任何血缘关系。这种设计使得命名管道非常适合那些需要在任意进程间共享信息的应用场景。 因为路径具有唯一性所以我们可以使用路径文件名来唯一的让不同进程看到同一份资源 4. 命名管道的打开规则
如果当前打开操作是为读而打开FIFO时 O_NONBLOCK disable阻塞直到有相应进程为写而打开该FIFO O_NONBLOCK enable立刻返回成功 如果当前打开操作是为写而打开FIFO时 O_NONBLOCK disable阻塞直到有相应进程为读而打开该FIFO O_NONBLOCK enable立刻返回失败错误码为ENXIO 5. system V 共享内存 System V是Unix操作系统的一个版本系列它起源于ATT贝尔实验室对早期Unix系统V的改进和发展。System V最初由System I第一代大型机Unix发展而来经历了多个版本包括System V Release 1 (SVR1) 到System V Release 4 (SVR4)后者也被称为Solaris 2.x。 System V的主要特点是稳定性、可靠性以及兼容性。它引入了许多重要的改进比如内核模块化设计、网络功能增强、标准工具集和系统管理工具的提升等。SVR4尤其显著它是许多现代Unix和Linux发行版的基础如Red Hat Enterprise Linux和SUSE Linux等。 System V也与POSIX标准紧密关联它定义了一套通用的应用程序接口API使得不同厂商的Unix系统之间能够更好地交互。
共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间这些进程间数据传递不再涉及到内核换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据 共享内存示意图 6. 共享内存的理解
System V共享内存是一种进程间通信IPCInter-Process Communication机制它允许不同的进程之间直接交换数据而无需通过文件系统或者网络。在Unix-like系统如Linux上System V模型源于System V Interprocess Communication Specification其核心思想是通过一段预分配的内存区域称为段或段映射让多个进程可以同时访问。
共享的原理和动态库的共享原理一致共享内存的申请主要分为以下三步 操作系统在物理内存上申请一块空间。将申请到的空间通过页表挂接到进程地址空间的共享区。返回起始虚拟地址供程序中使用。 我们想释放共享内存时就只需要去除掉我们在页表上的关联信息然后再将物理内存空间释放即可
在系统中一般都会有有多组进程都需要通信因此系统中一般会存在多个共享内存 所以操作系统要把这多个共享内存管理起来。
先描述再组织操作系统中一定有一个内核结构体是用来描述共享内存的。 7. 共享内存数据结构
struct shmid_ds {struct ipc_perm shm_perm; / operation perms /int shm_segsz; / size of segment (bytes) /__kernel_time_t shm_atime; / last attach time /__kernel_time_t shm_dtime; / last detach time /__kernel_time_t shm_ctime; / last change time /__kernel_ipc_pid_t shm_cpid; / pid of creator /__kernel_ipc_pid_t shm_lpid; / pid of last operator /unsigned short shm_nattch; / no. of current attaches /unsigned short shm_unused; / compatibility */void shm_unused2; / ditto - used by DIPC */void shm_unused3; / unused /
};struct shmid_ds 是 System V 共享内存的状态信息结构体在 Linux 系统中用来描述共享内存段的属性和状态。下面是 struct shmid_ds 结构体中各个成员的含义
成员含义struct ipc_perm shm_perm用于描述共享内存的操作权限。int shm_segsz共享内存段的大小以字节为单位。kernel_time_t shm_atime最后一次附加attach该共享内存的时间。kernel_time_t shm_dtime最后一次分离detach该共享内存的时间。kernel_time_t shm_ctime最后一次修改该共享内存的时间。kernel_ipc_pid_t shm_cpid创建者进程的进程号PID。__kernel_ipc_pid_t shm_lpid最后一次操作该共享内存的进程号PID。unsigned short shm_nattch当前附加attach该共享内存的进程数。unsigned short shm_unused未使用的字段用于兼容性。void shm_unused2未使用的字段由 DIPCDistributed Inter-Process Communication使用。void* shm_unused3未使用的字段。 通过这些状态信息我们可以获取共享内存段的大小、权限、最后访问时间、创建者信息以及当前附加进程的数量等相关信息。这些信息对于管理和监控共享内存非常有用能够帮助我们更好地理解和控制共享内存的状态。 8. 共享内存函数
shmget函数—创建共享内存 int shmget(key_t key, size_t size, int shmflg); shmget()是Unix/Linux系统提供的一种System V共享内存管理函数它的作用是在内核级为应用程序动态创建一块预分配的共享内存区域。这个函数需要以下几个关键参数 key这是一个整数用于标识共享内存区。相同的key值会产生相同的共享内存资源方便程序找到并链接起来。size想要创建的共享内存块的大小以字节为单位。 flag标志位通常包括以下几个选项 SHM_RDONLY: 创建只读共享内存 SHMReadWrite 或 0: 创建可读写共享内存 SHM创造出错时保留旧的内容: 如果先前存在同key的共享内存就保留它 调用shmget()返回一个进程ID如果成功则指向新的或已存在的共享内存区域的首地址若失败则返回-1并设置errno错误码。
使用完毕后通过shmat()函数将这个地址映射到进程的地址空间然后就可以像普通数组那样访问共享内存了。当不再需要时应调用shmdt()解除内存映射最后使用shmctl()函数关闭共享内存区域。 shmat函数—将共享内存段连接到进程地址空间 void *shmat(int shmid, const void shmaddr, int shmflg); 这个函数是一个C语言中的函数原型用于进程间的共享内存操作。它属于系统调用的一部分常在头文件sys/shm.h中找到。函数接收三个参数 shmid (整型)这是由之前调用 shmget() 函数获取的共享内存标识符代表了要连接到的共享内存块。shmaddr (void)这是一个可选参数如果提供表示希望映射到特定的物理地址。如果没有指定就会从已创建的共享内存的第一个字节开始映射。shmflg (标志位)这是操作标志可以包含以下几个标志之一例如 SHM_RDONLY 或 SHM_WRITECOPY 等来控制共享内存的行为如只读、写入副本等。 函数的返回值是 void * 类型代表了映射到进程地址空间内的共享内存的起始位置。如果操作成功返回非NULL地址失败则返回 NULL。使用完共享内存后需要调用 shmdt() 函数解除映射。 shmaddr为NULL核心自动选择一个地址 shmaddr不为NULL且shmflg无SHM_RND标记则以shmaddr为连接地址。 shmaddr不为NULL且shmflg设置了SHM_RND标记则连接的地址会自动向下调整为SHMLBA的整数倍。公式shmaddr - (shmaddr % SHMLBA) shmflgSHM_RDONLY表示连接操作用来只读共享内存 shmdt函数—将共享内存段与当前进程脱离 int shmdt(const void *shmaddr); Unix/Linux 系统下的 System V 共享内存 API 中的一个函数用于将共享内存段从进程的地址空间中分离出来。这个函数接收一个指向共享内存区域通常是从 shmat() 或者 shm_open() 创建的的指针作为参数。 shmaddr: 由shmat所返回的指针 返回值成功返回0失败返回-1 当你调用 shmdt(shmaddr) 时它会让当前进程不再直接映射该内存块到它的虚拟地址空间中但仍保留对这块内存的所有权。这通常发生在你想结束对共享内存的访问但并不立即删除它因为其他进程可能还在使用这个内存。随后你可以通过 shmctl() 来正式地取消共享内存SHM_RMID 命令或者直到所有关联进程都终止才会自动清除。
注意 将共享内存段与当前进程脱离不等于删除共享内存段 shmctl函数 —控制共享内存 int shmctl(int shmid, int cmd, struct shmid_ds *buf); Linux 系统提供的 System V 共享内存管理函数。此函数的作用是控制已存在的共享内存段由 shmat() 或 shmopen() 创建并分配给特定 ID (shmid) 的那段内存。它接受三个参数
shmid是一个整数表示之前通过 shmget() 函数创建的共享内存标识符。cmd是一个操作命令例如 SHM_INFO获取关于指定共享内存的信息如大小、创建时间等并存储在 buf 结构中。 SHM_SETATTR修改共享内存属性比如设置权限等。 SHM_RENAME改变共享内存名称。 SHM_LOCK 和 SHM_UNLOCK锁定或解锁共享内存区域。 SHM.removeItem 或 SHM_RMID删除共享内存。 buf如果 cmd 包含信息请求或需要传递数据则此指针指向一个 struct shmid_ds 结构用于存储响应信息。
通过这个函数进程可以管理和维护其使用的共享内存资源。 9. 共享内存通信
processa
#include comm.hpp
#include unistd.hint main()
{// 创建共享内存int shmid CreatMem();// 挂接共享内存char shamem (char)shmat(shmid, nullptr, 0);// ipc-cod 通信代码while(true){cout client asy shamem endl; // 直接访问共享内存sleep(1);}// 去关联shmdt(shamem);// 释放共享内存int ret shmctl(shmid, IPC_RMID, NULL);return 0;
}
processb
#include comm.hpp
#include unistd.hint main()
{// 获取共享内存int shmid GetMem();// 挂接char shmaddr (char)shmat(shmid, nullptr, 0);// ipc-code 通信代码while(true){cout Please enter:;fgets(shmaddr, size, stdin);}// 去关联shmdt(shmaddr);return 0;
}
一旦有了共享内存并且挂接到当前进程的地址空间上了在程序中就把它当做该进程自己的内存空间来使用即可无需再调用系统调用。一旦有人把数据写入到共享内存其实我们立马就能看到不需要经过系统调用就能直接看到数据。可以把共享内存就当做用户自己 malloc 出来的一块空间。
- 共享内存的特点 共享内存的共享内存是所有的进程间通信中速度最快的。 数据存储在一个可以被多个进程直接访问的物理内存区域。这种方式的优点在于速度极快因为不需要经过网络传输或系统调用进程可以直接读写内存中的数据无需中间环节。它特别适合于在同一台机器上、对性能有极高要求的应用程序之间比如实时系统和高性能计算。进程在使用的时候需要将内容从写端拷贝到管道然后再将内容拷贝到读端就会有两次拷贝而共享内存则只需要拷贝一次因为我们写是拷贝到共享内存中从共享内存中读取就相当于在文件中读取数据这就不算拷贝 在共享内存中通常通过映射文件或内存段使得进程能够映射相同的地址空间然后就可以直接操作这块内存了。它的缺点是需要所有涉及的进程都能正确地管理这部分内存并同步对它的访问防止数据冲突。同时由于涉及硬件层面如果进程崩溃未正常结束可能会导致其他进程的内存访问混乱。 共享内存可以提供较大的空间 共享内存允许进程之间共享非常大的数据块因为它基于物理内存而不是受限的系统消息队列。这种特性使得它可以支持跨越核心甚至整个计算机系统的大型数据结构例如大规模数组、复杂的算法数据结构等。由于它是直接在内存中交换数据因此不存在像文件I/O那样的限制也不受文件大小的约束。 然而尽管空间大但共享内存也有其局限性。首先内存资源是有限的如果分配的空间过大超过了可用内存可能会导致系统不稳定。其次当涉及到跨机器的共享内存时这通常通过特殊的网络技术和集群配置才能实现而且会带来额外的复杂性和开销。此外管理和同步共享的大空间数据也是一个挑战需要考虑数据的一致性和并发控制问题。
- 上一篇: 怎样做类似于优酷的视频网站哪种网站开发简单
- 下一篇: 怎样做社交网站WordPress整站搬家插件
相关文章
-
怎样做类似于优酷的视频网站哪种网站开发简单
怎样做类似于优酷的视频网站哪种网站开发简单
- 技术栈
- 2026年03月21日
-
怎样做类似于优酷的视频网站高端网站建设上
怎样做类似于优酷的视频网站高端网站建设上
- 技术栈
- 2026年03月21日
-
怎样做集装箱网站酒店网站案例
怎样做集装箱网站酒店网站案例
- 技术栈
- 2026年03月21日
-
怎样做社交网站WordPress整站搬家插件
怎样做社交网站WordPress整站搬家插件
- 技术栈
- 2026年03月21日
-
怎样做淘宝的导购网站前程无忧网宁波网站建设类岗位
怎样做淘宝的导购网站前程无忧网宁波网站建设类岗位
- 技术栈
- 2026年03月21日
-
怎样做淘宝客导购网站北京企业网站开发公司哪家好
怎样做淘宝客导购网站北京企业网站开发公司哪家好
- 技术栈
- 2026年03月21日
