System V IPC相关函数

System V IPC

将一个已保存的路径名和一个整数标识符转换成一个key_t值,称为IPC键
key_t:System V IPC(System V消息队列、System V信号量、System V共享内存区)将key_t作为
它们的名字

#include <sys/ipc.h>

key_t ftok(const char *pathname, int id);

ipc_perm结构:

内核给每个IPC对象维护一个信息结构

#include <sys/ipc.h>

struct ipc_perm{
    uid_t uid;    // 属主ID
    gid_t gid;    // 属组ID
    uid_t cuid;   // 创建者ID
    gid_t cgid;   // 创建者组ID
    mode_t mode;  // 读写权限
    ulong_t seq;  // 序列号
    key_t key;    // IPC键
};
// ipc_perm中的可以值可以是ftok()函数的返回值,也可以是IPC_PRIVATE(创建一个唯一的IPC对象)

System V消息队列:

内核为每个消息队列维护的信息结构:

#include <sys/msg.h>

struct msqid_ds{
    struct ipc_perm msg_perm;   // 内核给每个IPC对象维护的一个信息结构
    struct msg      *msg_first; // 指向队列中的第一个消息的指针
    struct msg      *msg_last;  // 指向队列中最后一个消息的指针
    msglen_t        msg_cbytes; // 此时的队列长度
    msgqnum_t       msg_qnum;   // 此时队列中消息的数量
    msglen_t        msg_qbytes; // 队列允许的最大长度
    pid_t           msg_lspid;  // 最近调用msgsnd()的PID
    pid_t            msg_lrpid;  // 最近调用msgrcv()的PID
    time_t            msg_stime;  // 最近调用msgsnd()的时间
    time_t             msg_rtime;  // 最近调用msgrcv()的时间
    time_t             msg_ctime;  // 最近调用msgctl()的时间
};

msgget()函数:

#include <sys/msg.h>

// 创建一个消息队列或访问一个已存在的消息队列
// 成功返回非负标识符,出错返回-1
int msgget(key_t key, int oflag);

msgsnd()函数:

#include <sys/msg.h>

// 向标识符为msqid的消息队列放置一个消息
// 成功返回0,失败返回-1
int msgsnd(int msqid, const void *ptr, size_t length, int flag);
// flag可以为0,也可以为IPC_NOWAIT(非阻塞模式)
// length是以字节为单位指定待发送消息的长度,mtext的长度(sizeof(struct msgbuf) - sizeof(long))
// ptr是一个结构指针,下面是此结构的模板,此结构可以自行定义
struct msgbuf{
    long mtype;    // 消息类型
    char mtext[1]; // 消息数据
};

msgrcv()函数:

#include <sys/msg.h>

// 从标识符为msqid的消息队列读取一个消息
// 成功返回读入数据字节数,出错返回-1
ssize_t msgrcv(int msqid, void *ptr, size_t length, long type, int flag);
// ptr结构指针,length为返回的最大数据量
// type=0(返回消息队列的第一个消息)
// type>0(返回类型值为type的第一个消息)
// type<0(返回类型值小于或等于type绝对值的消息中类型值最小的第一个消息)

msgctl()函数:

#include <sys/msg.h>

// 在一个消息队列上的各种控制操作
// 成功返回0,出错返回-1
int msgctl(int msqid, int cmd, struct msqid_ds *buff);
// cmd = IPC_RMID 从系统中删除由msqid指定的消息队列
// cmd = IPC_SET 为指定消息队列设置msqid_ds结构下的msg_perm.uid、msg_perm.gid、msg_perm.mode、msg_perm.qbytes

原文地址:https://www.cnblogs.com/lnlin/p/9697254.html

时间: 2024-10-27 19:13:02

System V IPC相关函数的相关文章

3. System V IPC

System V IPC包含三种类型的IPC:System V消息队列.System V信号量.System V共享内存区 1. key_t键和ftok函数 三种类型的System V IPC使用key_t值作为名字.头文件<sys/types.h>定义key_t为一个至少32位的整数.函数ftok把一个已存在的路径名和一个整数标识符转换成一个key_t值,称为IPC键 #include <sys/ipc.h> key_t ftok(const char *pathname, in

linux进程间通讯-System V IPC 信号量

进程间通信的机制--信号量.注意请不要把它与之前所说的信号混淆起来,信号与信号量是不同的两种事物.有关信号的更多内容,可以阅读我的另一篇文章:Linux进程间通信--使用信号.下面就进入信号量的讲解. 一.什么是信号量 为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域.临界区域是指执行数据更新的代码需要独占式地执行.而信号量就可以提供这样的一种访问机制,让一个临界区同一时间只有一个线程在

第3章 System V IPC

3.1 概述 System V IPC函数: 3.2 key_t和ftok函数 key_t是System V IPC的外部标识符,又称为IPC键,通过键,多个进程在同一个IPC对象上会合 ftok函数将路径名和整数标识符转换为key_t值 #include <sys/ipc.h> key_t ftok(char *pathname,int id) 客户与服务器在pathname和id上达成一致,则双方通过调用ftok函数获取同一个IPC键 三个get函数中(msgget.semget.shmg

从并发处理谈PHP进程间通信(二)System V IPC

.container { margin-right: auto; margin-left: auto; padding-left: 15px; padding-right: 15px } .container::before,.container::after { content: " "; display: table } .container::after { clear: both } .container::before,.container::after { content:

UNIX 进程间通讯(IPC)概念(Posix,System V IPC)

 IPC(Inter-Process Communication,进程间通讯)可以有三种信息共享方式(随文件系统,随内核,随共享内存).(当然这里虽然说是进程间通讯,其实也是可以和线程相通的). 相对的IPC的持续性(Persistence of IPC Object)也有三种: 随进程持续的(Process-Persistent IPC) IPC对象一直存在,直到最后拥有他的进程被关闭为止,典型的IPC有pipes(管道)和FIFOs(先进先出对象) 随内核持续的(Kernel-persist

《Unix网络编程》卷2 读书笔记 第3章- System V IPC

1. 概述 三种类型的System V IPC:System V 消息队列.System V 信号量.System V 共享内存区 System V IPC在访问它们的函数和内核为它们维护的信息上共享许多类似点.本章讲述所有这些共同属性. 下图汇总了所有System V IPC 函数 2. key_t键.ftok函数 头文件sys/types.h把数据类型key_t定义为一个整数,通常是一个至少32位的整数 #include <sys/ipc.h> key_t ftok (const char

进程间同步---system v ipc 对象信号灯集

一.信号灯简介 Linux支持System V的信号灯(semaphore),是一种进程间通信的方式,只不过它和管道.FIFO或者共享内存不一样,信号灯主要用于同步或者互斥对共享资源的访问,它的发明来源于火车运行系统中的"信号灯",利用信号灯可以实现"PV"操作这种进程间同步进制.P操作时获得资源,将信号灯的值减1,如果结果不为负则执行完毕,进程获得资源,否则进程睡眠以等待的进程释放;V操作则是释放资源,给信号灯的值加1, 唤醒一个因执行P操作而等待的进程. 二.信

System V IPC 之共享内存

IPC 是进程间通信(Interprocess Communication)的缩写,通常指允许用户态进程执行系列操作的一组机制: 通过信号量与其他进程进行同步 向其他进程发送消息或者从其他进程接收消息 和其他进程共享一段内存区 System V IPC 最初是在一个名为 "Columbus Unix" 的开发版 Unix 变种中引入的,之后在 AT&T 的 System III 中采用.现在在大部分 Unix 系统 (包括 Linux) 中都可以找到. IPC 资源包含信号量.

System V IPC 之消息队列

消息队列和共享内存.信号量一样,同属 System V IPC 通信机制.消息队列是一系列连续排列的消息,保存在内核中,通过消息队列的引用标识符来访问.使用消息队列的好处是对每个消息指定了特定消息类型,接收消息的进程可以请求接收下一条消息,也可以请求接收下一条特定类型的消息. 相关数据结构 与其他两个 System V IPC 通信机制一样,消息队列也有一个与之对应的结构,该结构的定义如下: struct msqid_ds { struct ipc_perm msq_perm; struct m