在类unix操作系统下存在这样一个目录/var/log/,主要是记录操作系统相关的系统各个进程服务的日志信息
该日志系统的特性如下:
- 支持多进程并发写入同一文件
- 不同进程日志信息可以写入不同文件
- 支持使用head/tail/grep/cat/vi 等命令进行日志操作
我们可以利用mkfifo的原子特性来实现一个类似的日志系统,基本结构如下
写入fifo的进程代码如下:
#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 n",getpid()); write(fd, buf,strlen(buf)); sleep(5); } return 0; }
守护进程代码如下:
#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 n"); char public_buf[100]; int fd; //以只读的方式打开fifo fd = 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("%sn",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; }



