操作系统 进程间通信函数

一、进程间通信之消息队列

“消息队列”是在消息的传输过程中保存消息的容器。

对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读走消息。

消息队列与管道不同的是,消息队列是基于消息的,而管道是基于字节流的,且消息队列的读取不一定是先入先出。

消息队列也有类似管道一样的不足,就是每个消息的最大长度是有上限的(MSGMAX),每个消息队列的总的字节数是有上限的(MSGMNB),系统上消息队列的总数也有一个上限(MSGMNI)。

1.msgget函数
功能: 用于创建一个新的或打开一个已经存在的消息队列

原型:int msgget(key_t key, int msgflag);

2.msgctl函数
功能:系统调用对msqid标识的消息队列执行cmd操作列,即msgctl函数为消息队列的控制函数

原型:int msgctl(int msqid,int cmd,struct msqid_ds *buf);

3.msgsnd函数
功能:将一个新的消息写入队列

原型:int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

4.msgrcv函数
功能:从消息队列中读取消息

原型:ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
某些参数:
	msqid:消息队列的识别码
	
	msgp:指向消息缓冲区的指针,此位置用来暂时存储发送和接收的消息,是一个用户可定义的通用结构,形态如下:
struct msgbuf {
	long mtype; /* 消息类型,必须 > 0 */
	char mtext[1]; /* 消息文本 */
};

	msgsz:消息的大小
	
	msgtyp:消息类型
		msgtyp等于0 则返回队列的最早的一个消息。
		msgtyp大于0,则返回其类型为msgtyp的第一个消息。
		msgtyp小于0,则返回其类型小于或等于mtype参数的绝对值的最小的一个消息。

友情链接:
(1)【操作系统】Linux下进程间通信实现—消息队列
https://blog.csdn.net/sofia_m/article/details/79930625
(2)消息队列函数(msgget、msgctl、msgsnd、msgrcv)及其范例
https://blog.csdn.net/guoping16/article/details/6584024
(3)msgctl详解
http://support.sas.com/documentation/onlinedoc/sasc/doc700/html/lr2/z2101555.htm
(4)msgget详解
http://support.sas.com/documentation/onlinedoc/sasc/doc700/html/lr2/z2101550.htm
(5)Linux进程间通信(七):消息队列 msgget()、msgsend()、msgrcv()、msgctl()
https://www.cnblogs.com/52php/p/5862114.html
(6)linux c学习笔记----消息队列(ftok,msgget,msgsnd,msgrcv,msgctl)
https://lobert.iteye.com/blog/1743256

二、进程间通信之共享内存

共享内存是 Unix下的多进程之间的通信方法 ,这种方法通常用于一个程序的多进程间通信,实际上多个程序间也可以通过共享内存来传递信息。

1.shmget函数
功能:得到一个共享内存标识符或创建一个共享内存对象

原型:int shmget(key_t key, size_t size, int shmflg);

2.shmat函数
功能:把共享内存区对象映射到调用进程的地址空间

原型:void *shmat(int shmid, const void *shmaddr, int shmflg);

3.shmctl函数
功能:共享内存管理

原型:int shmctl(int shmid, int cmd, struct shmid_ds *buf);

4.shmdt函数
功能:断开共享内存连接

扫描二维码关注公众号,回复: 6765674 查看本文章
原型:int shmdt(const void *shmaddr);

友情链接:
(1)Linux下利用信号量函数和共享内存函数和C语言实现生产者消费者问题
https://blog.csdn.net/qq_31490151/article/details/78984593
(2)Linux进程间通信(六):共享内存 shmget()、shmat()、shmdt()、shmctl()
https://www.cnblogs.com/52php/p/5861372.html

三、进程间信号量

头文件 #include<semaphore.h>

1.sem_init函数
功能:创建信号量,或初始化一个定位在 sem 的匿名信号量

原型:int sem_init(sem_t *sem, int pshared, unsigned int value);

2.sem_wait函数
功能:sem_wait是一个函数,也是一个原子操作,它的作用是从信号量的值减去一个“1”,但它永远会先等待该信号量为一个非零值才开始做减法

原型:int sem_wait(sem_t * sem);

sem_trywait(sem_t *sem)是函数sem_wait的非阻塞版,它直接将信号量sem减1,同时返回错误代码。

3.sem_post函数
功能:sem_post是给信号量的值加上一个“1”,它是一个“原子操作”,即同时对同一个信号量做加“1”操作的两个线程是不会冲突的;而同时对同一个文件进行读和写操作的两个程序就有可能会引起冲突

原型:int sem_post(sem_t *sem);

4.semget函数
功能:创建一个新信号量或取得一个已有信号量,即获取与某个键关联的信号量集标识

原型:int semget(key_t key,int nsems,int semflg);

信号量集被建立的情况有两种:
1.如果键的值是IPC_PRIVATE。
2.或者键的值不是IPC_PRIVATE,并且键所对应的信号量集不存在,同时标志中指定IPC_CREAT。

5.semop函数
功能:改变信号量的值。当它的值大于 0 时,表示当前可用的资源数的数量;当它的值小于 0 时,其绝对值表示等待使用该资源的进程个数。信号量的值仅能由 PV 操作来改变

原型:int semop(int semid,struct sembuf *sops,size_t nsops);

6.semctl函数
功能:直接控制信号量信息,即系统调用semctl用来执行在信号量集上的控制操作

原型:int semctl(int sem_id, int sem_num, int command, ...);
如果有第四个参数,它通常是一个union semum结构,定义如下:
union semun {
    int val;
    struct semid_ds *buf;
    unsigned short *arry;
};

友情链接:
(1)linux 多线程之信号量 sem_init
https://blog.csdn.net/qq_19923217/article/details/82902442
(2)Linux进程间通信(五):信号量 semget()、semop()、semctl()
https://www.cnblogs.com/52php/p/5851570.html

猜你喜欢

转载自blog.csdn.net/JxufeCarol/article/details/90298318