linux进程间通信:FIFO应用 /var/log/ 系统日志的模拟实现
在类unix操作系统下存在这样一个目录/var/log/
,主要是记录操作系统相关的系统各个进程服务的日志信息
该日志系统的特性如下:
- 支持多进程并发写入同一文件
- 不同进程日志信息可以写入不同文件
- 支持使用head/tail/grep/cat/vi 等命令进行日志操作
我们可以利用mkfifo
的原子特性来实现一个类似的日志系统,基本结构如下
写入fifo的进程代码如下:
/*************************************************************************> File Name: write_fifo.c> Author: > Mail: > Created Time: 二 9/24 12:16:37 2019************************************************************************/#include<stdio.h>
#include <unistd.h>
#include <strings.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>#define FIFO_NAME "testfifo"int main(int argc, char* argv[])
{int fd;char buf[100];//创建fifo mkfifo(FIFO_NAME, 0644);fd = open(FIFO_NAME, O_WRONLY);//每隔5秒向fifo中写入数据while (1){memset(buf,0,100);sprintf(buf,"process %d : log \n",getpid());write(fd, buf,strlen(buf));sleep(5);}return 0;
}
守护进程代码如下:
/*************************************************************************> File Name: daemon_fifo.c> Author: > Mail: > Created Time: 二 9/24 12:10:37 2019************************************************************************/#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define LOG_PATH "/var/log/process.log"
#define FIFO_NAME "testfifo" int main()
{// 和写入进程一样 创建一个同名的fifo用作守护,int f= mkfifo(FIFO_NAME,0644);printf("mkfifo result %d \n");char public_buf[100];int fd;//以只读的方式打开fifofd = open(FIFO_NAME,O_RDONLY);if (fd == -1)_exit(-1);memset(public_buf,0,100);int file_fd;//创建日志文件,可以追加写,并提供全用户及用户组的读写权限file_fd = open(LOG_PATH,O_CREAT | O_RDWR | O_APPEND);if ( -1 == file_fd)_exit(-1);int read_len = 0;while(1){//循环从fifo中读取数据read_len = read(fd,public_buf,100);if (read_len == -1)_exit(-1);//读取出来之后执行下刷到日志操作else if (read_len > 0){printf("%s\n",public_buf);write(file_fd,public_buf,strlen(public_buf));}else{sleep(3);printf("write log failed \n");continue;}sleep(1);}close(file_fd);return 0;
}
相关文章:

context.xml mysql_在tomcat下context.xml中配置各种数据库连接池(示例代码)
Tomcat6的服务器配置文件放在 ${tomcat6}/conf 目录底下。我们可以在这里找到 server.xml 和 context.xml。当然,还有其他一些资源文件。但是在在本文中我们只用得上这两个,其他的就不介绍了。1,首先,需要为数据源配置一个JNDI资源。我们的数…

Planetary.js:帮助你构建超炫的互动球体效果
Planetary.js 是一个 JavaScript 库,用于构建互动球体效果。它使用 D3 和 TopoJSON 解析和渲染地理数据。Planetary.js 采用了基于插件的架构,即使是默认的功能是作为插件实现的,这使得 Planetary.js 非常灵活。Planetary.js 是完全可定制&am…

JAVA条件表达式的陷阱
Map<String, Integer> map new HashMap<String, Integer>(); map.put("count", null); Integer it map null ? 0 : map.get("count"); 注意:在第三行,会抛出java.lang.NullPointerException信息。因为分析&…

腾讯Bugly异常崩溃SDK接入
首先登入Bugly,创建应用,记录下AppId ①下载SDK,通过Cocoapods集成 pod Bugly #腾讯异常崩溃日志服务 ②导入头文件,并初始化 /** 腾讯Bugly */#import <…

linux进程间通信:FIFO实现进程间的双向通信
fifo的双向通信的方式如下图: 两个进程间的通信需要两个命名管道,分别处理一个进程的读和写 导致这种通信方式出现的根因还是由于fifo的阻塞读和阻塞写,所以这里需要使用两个管道对读写进行分别处理。 同时因为管道传输的数据为流式数据&…

load python txt文件_详解Python中numpy.loadtxt()读取txt文件
为了方便使用和记忆,有时候我们会把 numpy.loadtxt() 缩写成np.loadtxt() ,本篇文章主要讲解用它来读取txt文件。读取txt文件我们通常使用 numpy 中的 loadtxt()函数numpy.loadtxt(fname, dtype, comments#, delimiterNone, convertersNone, skiprows0, usecolsNone…

线程之线程标识
就像每个进程有一个进程ID一样,每个线程也有一个线程ID。进程ID在整个系统中是唯一的,但线程ID不同,线程ID只在它所属的进程环境中有效。 进程ID,用pid_t数据类型来表示,是一个非负整数。线程ID则用pthread_t数据类型来…

Tab Bar Animation
2019独角兽企业重金招聘Python工程师标准>>> 自定义UITabBar。自定义Tab Bar切换过程中的动画效果。用户点击某个Tab,一个小箭头会从之前的Tab上面移动到当前点击的Tab上面。可以在tab上面加上小箭头用于显示当前处于哪个tab。 Code4App编译测试…

CynosDB技术详解——存储集群管理
本文由腾讯云数据库发表 前言 CynosDB是架构在CynosFS之上的分布式关系数据库系统,为最大化利用存储资源,平衡资源之间的竞争,检查资源使用情况,需要一套高效稳定的分布式集群管理系统(SCM: Storage Cluster Manager&a…

linux进程间通信:system V消息队列
文章目录基本介绍编程接口代码实例消息队列的发送和接收消息队列中的消息对象的属性控制基本介绍 支持不同进程之间以消息(messages)的形式进行数据交换,消息能够拥有自己的标识,且内核使用链表方式进行消息管理。进程之间的通信…

将一个一维数组转化为二进制表示矩阵。例如_算法之矩阵最大区域问题
例如:给定一个m*m(0<n)的矩阵,请找到此矩阵的一个子矩阵,并且此子矩阵的各个元素的和最大,输出这个最大的值。或者给出一个柱形矩阵求最大子矩阵的最大值。首先我们需要了解一下最大字段和问题。最大子段和问题给定一个长度为n…

伪元素first-letter
用于设置一个块级元素首位字符的样式,而且仅对该字符设置样式 p:first-letter{ font-size:200%}是让P中的第一个字符是其他字符大小的两倍转载于:https://www.cnblogs.com/damade/p/3518583.html

fedora17 的 rc.local
Fedora17上已经找不到/etc/rc.local了,如果我们想开机执行某个脚本,就需要手动创建这个文件,目录也发生了小小变化: 1. 新建文件/etc/rc.d/rc.local,第一行须指明执行shell: [root www.linuxidc.com rc.d]#…

使用TortoiseGit,设置ssh方式连接git仓库。
开始设置之前的准备:建立项目文件夹,初始化git仓库(右键 git init),右键打开 git bash ,git pull “仓库地址”, 把网站上的仓库代码拉取下来。 TortoiseGit使用扩展名为ppk的密钥,而不是ssh-keygen生成的rsa密钥。 也…

linux进程间通信:消息队列实现双端通信
双端通信描述 利用消息队列针对发送接受消息的类型唯一性 进行多个客户端之间消息传递,而不需要server端进行消息转发。 同时消息队列的读阻塞和写阻塞特性(消息队列中已经写入数据,如果再不读出来,则无法再次写入)让…

windows 软件安装事件_苹果安装windows,报windows支持软件未能存储到所选驱动器
今天去给一个IT外包客户维修电脑,前台的一台苹果电脑需要安装双系统,苹果电脑安装双系统对我们专业安装系统工程师来说,这不是很简单的嘛!客户问需要多长时间,信心满的说一到两个小时!客户说那你开始弄吧。…

C# Attribute简介
一 、EventAttribute有: BrowsableAttribute 、CategoryAttribute、DescriptionAttribute、DefaultEventAttribute PropertyAttribute有: BrowsableAttribute 、CategoryAttribute、DescriptionAttribute、 DefaultPropertyAttribute、DefaultValueAttri…

P2P之UDP穿透NAT的原理
关键词: P2P UDP NAT 原理 穿透 Traveral Symmetric Cone原始作者: Hwycheng Leo(FlashBTHotmail.com)源码下载: http://bbs.hwysoft.com/download/UDP-NAT-LEO.rar参考:http://midcom-p2p.sourceforge.net/draft-ford-midcom-p2p-01.txt P2P之UDP穿透NAT的原理…

快速幂运算and 快速乘运算
ll qpow(ll a,ll b) {ll ans1;while(b){if(b&1) ans(ans*a)%mod;a(a*a)%mod;b>>1;}return ans; } 快速乘运算 ll mult(ll a,ll b,ll mod) {a%mod,b%mod;ll sa,sum0;while(b){if (b&1){sums;if (sum>mod)sum-mod;}b>>1;s<<1;if (s>mod)s-mod;}r…

linux进程间通信:system V 共享内存
文章目录思维导图如下通信原理优势运行流程编程接口编程实例思维导图如下 通信原理 多个进程共享物理内存的同一块区域(通常称之为“段”:segment)抛弃了内核态消息转存处理的过程,让两个进程直接通过一块内存进行通信 我们普通的像PIPE,FI…

python函数手册68_直接在python中检索68个内置函数?
Python 3.5中的一种方法是列出具有__module__属性的对象,并将其设置为builtins和lowercase name:>>> sorted(k for k, v in vars(__builtins__).items()if k.islower() and getattr(v, __module__, ) builtins)[__build_class__, __import__, abs, all, a…

《深入理解Java虚拟机》笔记3
垃圾收集算法 (1)标记清除 根据根搜索确定对象是否已死,已死对象标记,然后一起清除。 这个其实不算什么算法,最正常想法应该就是这样。但是,缺点 是效率不高,如果有很多不连续的小对象需要回收,会花好多时间…

Step-By-Step在AIX上安装Oracle RAC
最近遇到一个项目,是在AIX5.3上安装ORACLE 9i RAC,说实话,ORACLE俺压根就没有接触过,我也是临危受命。感觉如同当年实施AS400的XSM项目一般。无奈,下载了N多本REDBOOK开始研究,终于有了些眉目,找…

Python中输出字体的颜色设置
1.实现过程 终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关。控制字符颜色的转义序列是以ESC开头,即用\033来完成 2.书写过程开头部分: \033[显示方式;前景色;背景色m结尾部分: \033[0m注意:开头部分的三个…

linux进程间通信:system V 信号量
文章目录概念描述通信原理编程接口使用流程编程案例概念描述 英文:semaphore 简称SEM,主要用来进行进程间同步本质:内核维护的一个正整数,可对其进行各种/-操作分类:systemV 信号量、POSIX 有名信号量、POSIX 无名信号…

设计模式总结1
1.代码不是没有错误就是最好的 (1)命名要规范-------取一个好的名字。 (2)代码少做无用功。 (3)注意逻辑错误。 (4)面向对象:可维护、可复用、可扩展、灵活性好。 2.简单…

mysql 单选字段_mysql字段类型
学习自 https://www.cnblogs.com/jennyyin/p/7895010.html,感谢原博主的奉献mysql支持多种类型,大致可以分为三类:数值、字符串、日期/时间。数值类型类型大小范围(有符号)范围(无符号)用途tinyint1字节(-128, 127)(0,255)小整数值smallint2字…

ios时间差,以时间格式显示
为什么80%的码农都做不了架构师?>>> NSDate *nowDate [[NSDate alloc]init]; double diffTime [nowDate timeIntervalSinceDate:preDate]; int diffHour diffTime / (60*60); int diffMin ( diffTime - diffHour*(60*60) ) / (60); int diffSec…

深入理解C++中public、protected及private用法
深入理解C中public、protected及private用法 这篇文章主要介绍了C中public、protected及private用法,对于C面向对象程序设计来说是非常重要的概念,需要的朋友可以参考下初学C的朋友经常在类中看到public,protected,private以及它们在继承中表示的一些访问…

v-vim 代码批量缩进,字符串精确查找及替换
vim中代码批量缩进 有如下两种办法,主要依靠>和<字符来进行 缩进的单位通过设置~/.vimrc,添加如下行 set tabstop4 "设定tab宽度为4个字符 set shiftwidth4 "设定自动缩进为4个字符 set expandtab "用space替代tab的输入 set noexpandtab &q…