首页 > linux进程间通信:FIFO应用 /var/log/ 系统日志的模拟实现

linux进程间通信:FIFO应用 /var/log/ 系统日志的模拟实现

在类unix操作系统下存在这样一个目录/var/log/,主要是记录操作系统相关的系统各个进程服务的日志信息

在这里插入图片描述

该日志系统的特性如下:

  1. 支持多进程并发写入同一文件
  2. 不同进程日志信息可以写入不同文件
  3. 支持使用head/tail/grep/cat/vi 等命令进行日志操作

我们可以利用mkfifo的原子特性来实现一个类似的日志系统,基本结构如下

在这里插入图片描述

写入fifo的进程代码如下:

/*************************************************************************> File Name: write_fifo.c> Author: > Mail: > Created Time: 二  9/24 12:16:37 2019************************************************************************/#include
#include 
#include 
#include 
#include 
#include 
#include 
#include #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 
",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 
#include 
#include 
#include 
#include 
#include 
#include 
#define LOG_PATH "/var/log/process.log"
#define FIFO_NAME "testfifo" int main()
{ // 和写入进程一样 创建一个同名的fifo用作守护,int f= mkfifo(FIFO_NAME,0644);printf("mkfifo result %d 
");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
",public_buf);write(file_fd,public_buf,strlen(public_buf));}else{ sleep(3);printf("write log failed 
");continue;}sleep(1);}close(file_fd);return 0;
}

更多相关:

  • 关于点云的分割算是我想做的机械臂抓取中十分重要的俄一部分,所以首先学习如果使用点云库处理我用kinect获取的点云的数据,本例程也是我自己慢慢修改程序并结合官方API 的解说实现的,其中有很多细节如果直接更改源程序,可能会因为数据类型,或者头文件等各种原因编译不过,会导致我们比较难得找出其中的错误,首先我们看一下我自己设定的一个场景,...

  • /* 使用正态分布变换进行配准的实验 。其中room_scan1.pcd room_scan2.pcd这些点云包含同一房间360不同视角的扫描数据 */ #include #include #include #include

  • #include #include #include #include ...

  • #include #include #include #include #include #include...

  • #include #include #include #include int main (int argc,...

  •         NSString * str = @"123";char buf[20];[str getCString:buf maxLength:20 encoding:NSASCIIStringEncoding];NSLog(@"%s",buf); 转载于:https://blog.51cto.com/8947509/1...

  • sscanf 目录 名称:函数原型:头文件:说明:支持集合操作:例子: 编辑本段名称:   sscanf() - 从一个字符串中读进与指定格式相符的数据. 编辑本段函数原型:   Int sscanf( const char *, const char *, ...);   int scanf( const char...

  • fifo的双向通信的方式如下图: 两个进程间的通信需要两个命名管道,分别处理一个进程的读和写 导致这种通信方式出现的根因还是由于fifo的阻塞读和阻塞写,所以这里需要使用两个管道对读写进行分别处理。 同时因为管道传输的数据为流式数据,则无法对数据进行指定标记(数据的发送者,接受者,大小。。。)。 SERVER端代码如下: /*...

  • 文章目录介绍重定向函数介绍总结 linux terminal输入如下命令,其中"|"符号即为我们上文中所说的无名管道 介绍 正如我们上文中所描述的"|“无名管道提供了具有亲缘关系的进程之间的通信,它由于直接使用系统调用,运行效率较高。则linux系统下可以大批量的使用”|"来提供命令直接输入输出的重定向。 具体sh...

  • 2019独角兽企业重金招聘Python工程师标准>>> fd_set 结构,是一个数字。 文件描述符fd的值 不能超过1024,而不是数量不能超过1024。 在开发打开句柄多的程序时,最好不要使用select。否则就使用多进程开发。 /usr/include/X11 Xpoll.h 文件 #ifndef _XPOLL_H_#...