linux网络编程之POSIX共享内存和系列函数

在前面介绍了system v 共享内存的相关知识,现在来稍微看看posix 共享内存 和系列函数。

共享内存简单来说 就是一块真正的物理内存区域,可以使用一些函数将这块区域映射到进程的地址空间进行读写,而posix 共享内存与system v 共享内存不同的是它是用虚拟文件系统(tmpfs)实现的,已经挂载在/dev/shm 下面。man 7 shm_overview

下面 来看系列函数,编译时候加上 -lrt 选项,即连接librt 库 (实时库)

功能:用来创建或打开一个共享内存对象

原型 int shm_open(const char *name, int oflag, mode_t mode);

参数

name:共享内存对象的名字,必须以/打 头,并且后续不能有其它/ ,形如/somename长度不能超过NAME_MAX(255)

oflag:与open函数类似,可以是O_RDONLY、 O_RDWR,还可以按位或上O_CREAT、O_EXCL、O_TRUNC等。

mode:此参数总是需要设置,如果oflag没有指定了O_CREAT,可 以指定为0

返回值:成功返回非负整数文件描述符;失败返回-1

注意,不存在所谓的shm_close 函数,可以直接 使用close 来关闭文件描述符。

功能:修改共享内存对象大小,shm_open不像shmget一样可以设置共享内存的大小 ,但可以使用ftruncate 设置大小。

原型 int ftruncate(int fd, off_t length);

参数

fd: 文件描述符

length:长度

返回值:成功返回0;失败返回-1

功能:获取共享内存对象信息

原型

int fstat(int fd, struct stat *buf);

参数

fd: 文件描述符

buf:返回共享内存状态

返回值:成功返回0;失败返回- 1

struct stat 可以参考这里。

类似 shm_ctl(,IPC_STAT,);

功能:删除一个共享内存对象

原型 int shm_unlink(const char *name);

参数

name: 共享内存对象的名字

返回值:成功返回0;失败返回- 1

shm_unlink 类似 shm_ctl(,IPC_RMID,);

功能:将共享内存对象映射到进程地址空间。

原型void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset);

参数

addr: 要映射的起始地址, 通常指定为NULL,让内核自动选择

len:映射到进程地址空间的字节数

prot:映射区保护方式

flags:标志

fd:文件 描述符

offset:从文件头开始的偏移量

返回值:成功返回映射到的内存区的起始地址;失败返回-1

在前面曾经 介绍了mmap 函数 将文件映射到进程地址空间的作用,其实它还可以将共享内存对象映射到进程地址空间,类似shmat的作 用,只是传入的文件描述符fd 是shm_open 返回的。同样地,解除映射可以用munmap,类似shmdt 的作用。

时间: 2024-10-30 23:02:09

linux网络编程之POSIX共享内存和系列函数的相关文章

linux网络编程之POSIX消息队列和系列函数

一.在前面介绍了system v 消息队列的相关知识,现在来稍微看看posix 消息队列. 其实消息队列就是一个可 以让进程间交换数据的场所,而两个标准的消息队列最大的不同可能只是api 函数的不同,如system v 的系列函数是 msgxxx,而posix 是mq_xxx.posix 消息队列也有一些对消息长度等的限制,man 7 mq_overview: simba@ubuntu:~/Documents/code/linux_programming/UNP/posix$ cat /proc

linux网络编程之posix 线程(三)

posix 信号量与互斥锁 示例生产者--消费者问题 一.posix 信号量 信号量的概念参见这里(http://www.bianceng.cn/OS/Linux/201308/37243.htm).前面也讲过system v 信号量,现在来说说posix 信号量. system v 信号量只能用于进程间同步,而posix 信号量除了可以进程间同步,还可以线程间同步.system v 信号量每次PV操作可以是N,但Posix 信号量每次PV只能是1.除此之外,posix 信号量还有命名和匿名之分

linux网络编程之posix 线程(一)

pthread 系列函数 和 简单多线程服务器端程序 一.posix 线程概述 我们知道,进程在各自独立的地址空间中运行,进程之间共享数据需要用进程间通信机制,有些情况需要在一个进程中同时执行多个控制流程,这时候线程就派上了用场,比如实现一个图形界面的下载软件,一方面需要和用户交互,等待和处理用户的鼠标键盘事件,另一方面又需要同时下载多个文件,等待和处理从多个网络主机发来的数据,这些任务都需要一个"等待-处理"的循环,可以用多线程实现,一个线程专门负责与用户交互,另外几个线程每个线程负

linux网络编程之posix 线程(二)

线程的属性和 线程特定数据 Thread-specific Data 一.posix 线程属性 POSIX 线程库定义了线程属性对象 pthread_attr_t ,它封装了线程的创建者可以访问和修改的线程属性.主要包括如下属性: 1. 作用域(scope) 2. 栈尺寸(stack size) 3. 栈地址(stack address) 4. 优先级(priority) 5. 分离的状态(detached state) 6. 调度策略和参数(scheduling policy and para

linux网络编程之posix 线程(四)

posix 条件变量与互斥锁 示例生产者--消费者问题 一.posix 条件变量 一种线程间同步的情形:线程A需要等某个条件成立才能继续往下执行,现在这个条件不成立,线程A就阻塞等待,而线程B在执行过程中使这个条件成立了,就唤醒线程A继续执行. 在pthread库中通过条件变量(Condition Variable)来阻塞等待一个条件,或者唤醒等待这个条件的线程.Condition Variable用pthread_cond_t类型的变量表示,和Mutex的初始化和销毁类似,pthread_co

linux 网络编程之TIME_WAIT状态

                                                         Linux 网络编程之TIME_WAIT状态                                                               刚刚开始看TCP socket的4次握手终止流程图的时候,对于最后的TIME_WAIT状态不是很理解.现在在回过头来研究,发现TIME_WAIT状态是一个很微妙状态.之所以设计TIME_WAIT状态的原因有2个原因:

Linux网络编程之UDP Socket程序示例_C 语言

在网络传输协议中,TCP协议提供的是一种可靠的,复杂的,面向连接的数据流(SOCK_STREAM)传输服务,它通过三段式握手过程建立连接.TCP有一种"重传确认"机制,即接收端收到数据后要发出一个肯定确认的信号,发送端如果收到接收端肯定确认的信号,就会继续发送其他的数据,如果没有,它就会重新发送. 相对而言,UDP协议则是一种无连接的,不可靠的数据报(SOCK_DGRAM)传输服务.使用UDP套接口不用建立连接,服务端在调用socket()生成一个套接字并调用bind()绑定端口后就可

linux网络编程之System V 共享内存和系列函数

跟消息队列一样,共享内存也有自己的数据结构,如下: 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

linux网络编程之System V 信号量(三)

基于生产者-消费者模型实现先进先出的共享内存段 生产者消费者问题:该问题描述了两个共享固定大小缓冲区的进程--即所谓的"生产者"和"消费者"--在实际运 行时会发生的问题.生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程.与此同时,消费者也在缓冲区 消耗这些数据.该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据. 我们可以用信号量解决生产者消费者问题,如下图: 定义3个信号量,sem_full 和 sem_emp