【Linux计划】XSI IPC
三种IPC这就是所谓的XSI IPC,每间:
- 消息队列
- 信号量
- 共享存储器
- msgget:创建一个新队列或打开一个现存的队列。
- msgsnd:将消息加入到队列尾端。
- msgrcv:从队列中取消息。
struct mest_t {
long type; // 消息类型
char text[512]; // 消息内容
};
#include <stdio.h>
#include <sys/msg.h>
#include <sys/types.h>
#include <string.h>
#include <errno.h> struct mest_t {
long type;
char text[512];
}; int main(void)
{
pid_t pid;
int mq_id;
struct mest_t msg; /* IPC_PRIVATE用于创建一个新队列
* 设置了IPC_EXCL而且设置了IPC_CREAT。当文件存在时返回错误
*/
mq_id = msgget(IPC_PRIVATE, IPC_CREAT | IPC_EXCL);
if (mq_id == EEXIST)
return -1; /* 返回EEXIST表示IPC已存在 */ if ((pid = fork()) < 0)
return -1;
else if (pid == 0)
{
/* 子进程 */
msg.type = 123; /* 消息类型 */
strcpy(msg.text, "Hello world!"); /* 消息内容 */ /* 非堵塞方式将消息放入消息队列
* 队列已满则返回EAGAIN
*/
while (msgsnd(mq_id, (long *)&msg, 512, IPC_NOWAIT) == EAGAIN)
sleep(1);
}
else
{
/* 非堵塞方式从队列中取消息
* 假设没有指定类型的消息。函数返回-1,errno设置为ENOMSG
*/
while (msgrcv(mq_id, (long *)&msg, 512, 123, IPC_NOWAIT) == -1)
{
if (errno == ENOMSG)
{
printf("There is no this type message!\n");
sleep(1);
}
} printf("%s\n", msg.text);
} return 0;
}
可是改动msgrcv的消息类型參数后,执行结果例如以下:
- 測试控制该资源的信号量。
- 若此信号量的值为正。则进程能够使用该资源。进程将信号量值减1,表示它使用了一个资源单位。
- 若此信号量的值为0。则进程进入休眠状态,直至信号量大于0。进程被唤醒后。它返回至第一步。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/shm.h> #define SHM_SIZE 100
#define SHM_MODE (SHM_W | SHM_R | IPC_CREAT) int main()
{
int shmid;
char *shmptr;
pid_t pid; /* 获得共享存储标识符 */
if ((shmid = shmget(IPC_PRIVATE, SHM_SIZE, SHM_MODE)) < 0)
return -1; if ((pid = fork()) < 0)
return -1;
else if (pid == 0)
{
shmptr = shmat(shmid, 0, 0); /* 參数2为0表示由内核分配共享空间 */
printf("Child attached shared memory is : %lx\n", (unsigned long)shmptr);
shmdt(shmptr); /* 使进程脱离该共享空间 */
}
else
{
waitpid(pid, NULL, 0); shmptr = shmat(shmid, 0, 0);
printf("Parent attached shared memory is : %lx\n", (unsigned long)shmptr);
shmdt(shmptr); shmctl(shmid, IPC_RMID, 0); /* 删除该共享存储段 */
} return 0;
}
有一点须要注意,shmdt函数仅仅是让进程脱离该共享存储段,但该存储段依旧存在而且shmid依旧有效。它是与shmat相相应的。而还有一个函数shmctl使用IPC_RMID參数时才是真正删除该共享段。
【Linux计划】XSI IPC的更多相关文章
- linux进程间通信-XSI IPC
一 什么是XSI IPC 有三种 IPC我们称作XSI IPC,即消息队列.信号量以及共享存储器(共享内存),它们之间有很多相似之处. 二 标识符和键 每个内核中的 IPC结构(消息队 ...
- 进程间通信之XSI IPC
XSI IPC源自于系统V的IPC功能. 有三种IPC我们称作XSI IPC,即消息队列.信号量以及共享存储器,它们之间有很多相似之处. 1.标识符和键 每个内核中的IPC结构(消息队列.信号量或共享 ...
- 进程间通信——XSI IPC之消息队列
进程间通信XSI IPC有3种:消息队列.共享内存.信号量.它们之间有很多相似之处,但也有各自的特殊的地方.消息队列作为其中比较简单的一种,它会有些什么东西呢,来一起探讨探讨.. 消息队列结构 消息队 ...
- Linux ns 5. IPC Namespace 详解
文章目录 1. 简介 2. 源码分析 2.1 copy_ipcs() 2.2 ipcget() 2.3 ipc_check_perms() 2.4 相关系统调用 参考文档: 1. 简介 进程间通讯的机 ...
- linux下六大IPC机制【转】
转自http://blog.sina.com.cn/s/blog_587c016a0100nfeq.html linux下进程间通信IPC的几种主要手段简介: 管道(Pipe)及有名管道(named ...
- Linux计划任务Crontab实例详解教程
说明:Crontab是Linux系统中在固定时间执行某一个程序的工具,类似于Windows系统中的任务计划程序 下面通过详细实例来说明在Linux系统中如何使用Crontab 操作系统:CentOS ...
- Linux计划任务(转载)
Linux计划任务(转载) Linux的计划任务是系统管理方面的一个重要内容,是系统自动完成工作的一种实现方式,正因为有了计划任务,我们才可以完全实现系统管理的脚本化和自动化. 关于计划任务,Linu ...
- Linux 计划任务总结
今天项目用到了,Linux计划任务,从网上找了基本blog看了,总结了下. Linux 下的计划任务有atd和crond两种计划任务.atd服务使用的at命令只能执行一次,而crond服务使用的cro ...
- Linux. 计划任务 时间格式
Linux. 计划任务 时间格式 在linux中执行指令:cat /etc/crontab 结果,如下图所示: 结果一目了然,不多说. 如有问题,欢迎纠正!!! 如有转载,请标明源处:https:// ...
随机推荐
- [CSS] Design for Mobile First with Tachyons
Tachyons provides extensions (-ns, -m, and -l) to many of its classes to help you design for respons ...
- javascript合并数组并且删除第二项
var m1 = [5, 6, 2]; var m2 = [4, 2, 6]; var m3 = new Array(); m1 = m1.concat(m2); for ( ...
- Notepad++打开xml文件显示crlf的问题
如图所示,显示CRLF, CRLF其实是换行符. 所以在下图所示设置下显示行尾符不显示即可.
- 【机器学习实战】第10章 K-Means(K-均值)聚类算法
第 十 章 K-Means(K-均值)聚类算法 K-Means 算法 聚类是一种无监督的学习, 它将相似的对象归到一个簇中, 将不相似对象归到不同簇中.相似这一概念取决于所选择的相似度计算方法.K-M ...
- 轮询方法FileSystemWatcher
具体实现 FileSystemWatcher watcher = new FileSystemWatcher(WriteBackDir, "*result.txt"); watch ...
- Docker + .NET Core(二)
原文:Docker + .NET Core(二) 前言: 环境:centos7.5 64 位 正文: 首先我们在宿主机上安装 .NET Core SDK sudo rpm --import https ...
- 查询系统状态 内存大小 cpu信息 设备负载情况
1.1 查看内存状态 /proc/meminfo里面存放着内存的信息 查看内存命令(包括虚拟内存swap): free -h (低版本系统可能不支持-h) 或者 free -m (以mb单位显示) a ...
- Swift 中的Closures(闭包)详解
Swift 中的Closures(闭包)详解 在Swift没有发布之前,所有人使用OC语言编写Cocoa上的程序,而其中经常被人们讨论的其中之一 -- Block 一直备受大家的喜爱.在Swift中, ...
- android studio中文乱码各种情况的解决办法
情况一:编辑器内的中文注释乱码. 解决办法:在界面的右下角找到 UTF-8 ,单击之,在弹出的列表中选中GBK 在弹出框内选中Reload 总结:导致这样的原因是你这个.java文件本身是GBK编码的 ...
- OpenCL基本概念
OpenCL程序同CUDA程序一样,也是分为两部分,一部分是在主机(以CPU为核心)上运行,一部分是在设备(以GPU为核心)上运行.在设备上运行的程序被称为核函数.但是对于核函数的编写,CUDA一般直 ...