IO进程与线程

文章详细介绍了如何使用key_tftok生成用于创建IPC对象的key,包括使用ftok结合文件inode节点号和proj_id。接着,讲述了共享内存(shmget、shmdt、shmctl)的创建、映射和删除,消息队列(msgget、msgsnd、msgrcv)的使用,以及信号灯集(semget、semctl、semop)的操作,这些都是进程间通信的关键技术。
摘要由CSDN通过智能技术生成
key_t ftok(const char *pathname, int proj_id);
功能:生成一个key(目的在于创建IPC对象的时候不会冲突)
返回值:成功返回key值,失败为-1
pathname:一个文件可以包含路径
proj_id:一个随便的值
key值的生成需要某一个文件的inode节点号和proj_id进行组合运算
IPC 对象
ftok :生成一个 key (用于创建 IPC 对象)

 

1. 共享内存( shm
多个进程都可以访问同一个内存空间,而每个进程都是独立的空间,那么共享内存只能是在内核中。内
核会映射这个空间到用户空间来,用户进程访问映射后的空间等于是访问内核空间。
最高效的进程间通信方式 ,需要同步互斥的机制 .
打开 / 创建共享内存对象:
int shmget(key_t key, size_t size, int shmflg);
功能:打开一个共享内存对象
返回值:成功返回共享内存 id 号,失败返回 -1
key :一般使用 ftok 的值,如果要编程私有对象(使用 IPC_PRIVATE -- 0
size :要创建的共享内存空间大小
shmflg :打开对象的方式 -- IPC_CREAT IPC_EXCL
映射空间:
int shmdt(const void *shmaddr);
功能:取消共享内存的映射空间
返回值:成功返回 0 ,失败返回 -1
shmaddr :映射空间的地址

 删除对象:

int shmctl(int shmid, int cmd, struct shmid_ds *buf);
功能:共享内存对象的一些控制操作
返回值:成功返回 0 ,失败返回 -1
shmid :要操作的共享内存 id
cmd :要操作的方式 (获取属性、设置属性、删除对象)
IPC_RMID -- 删除
buf :设置或者查看属性的时候才有用,删除对象时使用 NULL

2.消息队列(msg

按照类型来选择是否接收消息,也是在内核中有一片空间用于交换消息,但是不需要映射
创建 / 打开消息队列:

 

int msgget(key_t key, int msgflg);
功能:打开或者创建一个消息队列对象
返回值:成功消息队列 id 号,失败返回 -1
key ftok 生成的 key ,或者 IPC_PRIVATE
msgflg :打开或者创建的方式, IPC_CREAT IPC_EXCL 还有权限 0666

 发送消息:

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
功能:往消息队列中添加某个类型的消息
返回值:成功返回 0 ,失败返回 -1
msqid :消息队列 ID
msgp :消息结构体
struct msgbuf {
long mtype; /* message type, must be > 0 */
char mtext [ 1 ] ; /* message data */
} ;
msgsz :结构体大小
msgflg IPC_NOWAIT 表示不等函数执行完成就返回, 0 表示函数执行完才返回

 接收消息:

ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,
int msgflg);
功能:从消息队列中提取自己关心的某个消息
返回值:成功返回实际收到的字节数,失败返回 -1
msqid :消息队列 ID
msgp :消息结构体,存放消息
msgsz :要收多少字节的数据
msgtype :关心的消息类型
msgflg IPC_NOWAIT 阻塞, 0 不阻塞

3.信号灯集(sem 

信号量的集合
信号灯集创建 / 打开
int semget(key_t key, int nsems, int semflg);
功能:打开或者创建一个信号灯集合对象
返回值:成功返回信号灯集合 ID ,失败返回 -1
key ftok IPC_PRIVATE
nsems :创建的信号灯集中有几种信号量
semflg :打开方式 IPC_CREAT 0666

信号灯集控制  

int semctl(int semid, int semnum, int cmd, ...);
功能:对信号灯集进行一些控制操作(比如设置内容,删除对象)
返回值:成功返回 0 ,失败返回 -1
semid :信号灯集的 id
semnum :要修改的信号灯的编号(从 0 开始)
cmd :控制指令
SETVAL -- 设置信号灯的值
GETVAL -- 获取信号灯的值
IPC_RMID -- 删除对象
信号灯的 PV 操作
int semop(int semid, struct sembuf *sops, size_t nsops);
功能:实现信号灯的申请或者释放等操作
返回值:成功返回 0 ,失败返回 -1
semid :信号灯集的 id
sops
struct sembuf {
unsigned short sem_num; // 要操作的信号灯编号
short sem_op; // 要操作的动作: 1 表示释放资源, -1 表示申请资源
short sem_flg; //0 表示阻塞, IPC_NOWAIT
}
nsops :要操作的信号灯个数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值