多进程/多线程同时向一个文件中写入日志如何避免冲突?
写入文件时都会调用函数 write,由于所有的系统调用都是原子的,所以该函数可以保证进程或者线程写入数据的过程中不会被其他进程或者线程打扰,即:数据中间插入别的进程的数据。
另外一个问题,由于 write 之前需要指定写入位置,即:lseek 函数,同样,该函数也是原子的。
整体来说,在一个写入数据的操作如下:
lseek(fd, 0, SEEK_END); // seek to the end of the filewrite(fd, "log message", len); // perform the write
but,这两个函数需要依次完成,中间不能被别的进程或者线程插入写入它们的数据,也就是说为了保证多进程或者多线程同时向一个文件中写入数据时能够避免冲突,需要上述两个函数的执行是事务性的。
为了解决这个问题,可以用标志位 O_APPEND,其含义是在每次打开文件时,都将标志位移动到文件的末端,这个过程时原子的。
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/wait.h>int main()
{char *filename = "my_data.txt";int fd = open(filename, O_WRONLY | O_CREAT);pid_t pid = fork();if (0 == pid){printf("this is child: %ld\n", (long)getpid());char buf[20];memset(buf, 'D', sizeof(buf));int fd = open(filename, O_WRONLY | O_CREAT | O_APPEND);write(fd, buf, sizeof(buf));close(fd);}else{printf("this is father: %ld\n", (long)getpid());char buf[30] = {2};memset(buf, 'A', sizeof(buf));buf[29] = '_';int fd = open(filename, O_WRONLY | O_CREAT | O_APPEND);write(fd, buf, sizeof(buf));close(fd);int status;wait(&status);}return 0;
}
结果:
AAAAAAAAAAAAAAAAAAAAAAAAAAAAA_DDDDDDDDDDDDDDDDDDDD
(SAW:Game Over!)
多进程/多线程同时向一个文件中写入日志如何避免冲突?相关推荐
- 将一个输入流(InputStream)写入到一个文件中
作用:将一个输入流写入到一个文件中 Random r = new Random(); InputStream input = body.asInputStream(); String fileName ...
- 从磁盘中读入一个文件并写入另一个文件
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import ...
- python读写文件详解,将数据写入一个文件或读一个文件写入另一个文件中。
目录 实践一:读取文件并打印,read() 实践二:读取文件的一行并打印,readline() 实践三:读取文件的所有行存入到一个列表中并打印,readlines() 实践四:向文件中写入字符串,wr ...
- python逐行写入csv_python 实现一次性在文件中写入多行的方法
python 实现一次性在文件中写入多行的方法 将要写入的内容 构造 进一个list 中,使用writelines()方法 一次性写入. file_w.writelines(list) file_w. ...
- php向页面中添加数据_PHP创建文件,并向文件中写入数据,覆盖,追加的实现代码...
创建文件我们用到函数 fopen ( string filename, string mode ) 参数filename为创建文件名 参数mode为以什么方式打开文件filename 其中mode可能 ...
- vc++向txt文件中写入数据,追加数据
例子: #include<iostream> #include<stdio.h> using namespace std; int main() { //将矩阵写在文件上 fl ...
- excel调用python编程-使用Python和xlwt向Excel文件中写入中文的实例
sheet1.write(row_num,0,f) row_num = 1 book.save('demo.xls') 程序执行结果如下: grey@DESKTOP-3T80NPQ:/mnt/e/01 ...
- 写文件 —— 将内容按照指定格式写入配置文件(fwrite()函数-》》向指定的文件中写入若干数据块)
例如 -- 文件中的配置内容格式如下: dat.txt的文件的内容为 [root@localhost tool]# cat dat.txt aa1213bbcc1415dd 参数说明 size_t ...
- 查找目录下的及子目录下的 所有的给定后缀名的文件并将其路径打印到一个文件中。
package FileDemo;import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; impo ...
最新文章
- 打印速度快点的打印机_佳能和爱普生打印机哪个好 高性价比打印机介绍【详解】...
- 抓图软件_Faststone capture8.3
- LeetCode 137. Single Number II--三次异或消除相同的数--C++,Python解法
- 关于node.js的思考
- oracle基本概念和术语
- Oracle 11g RAC ASM 错误之(1)
- html5列表去掉符号,从Python字符串中删除不在允许列表中的HTML标记
- pandas读取文件——CSV,Excel
- 基于tensorflow2.0利用CNN与线性回归两种方法实现手写数字识别
- 一个简单的pwn例子---read函数
- Python判断变量类型
- 组合框载入数据库的内容
- 利用谷歌翻译。帮助你的网站轻松实现多语言互换
- VIJOS 1512SuperBrother打鼹鼠(二维BIT)
- 罗技G304鼠标的按键宏定义
- word转pdf公式乱码_word转换pdf公式乱码怎么办
- 3.46 OrCAD软件怎么输出物料清单BOM表格?
- gg修改器修改数值没有用怎么办_gg修改器修改游戏数值教程_gg修改器怎么修改数值_3DM手游...
- 1284. Minimum Number of Flips to Convert Binary Matrix to Zero Matrix
- 新浪2010南非足球世界杯漂亮表格的制作
热门文章
- 《SAS编程与数据挖掘商业案例》学习笔记之十七
- error nr.1045 access denied for user 'root'@'localhost' (using passwd:no)
- 调试中的一些Python错误
- 编写完html文件怎么输出,怎么编写一个html文件?在线等!!
- 详细介绍注解@ConfigurationProperties使用
- 全网最详细SpringBatch批处理读取分区(Paratition)文件讲解
- vuex状态管理模式:入门demo(状态管理仓)
- 【收藏】GeoMesa-HBase原理篇——写入过程
- Linux vim光标移动命令
- Java NIO示例:多人网络聊天室完整代码