本文是这《Linux C/C++多进程同时写一个文件》系列文章的第三篇,上一篇文章演示了两个亲缘关系的进程(父子进程)同时写一个文件的情形,并得出了数据只会错乱但不会覆盖
的结论。这篇文章主要是在第一篇文章的基础上,加上上篇文章的分析,更深下一步地探索两个非亲缘关系的进程同时写一个文件的问题。
1 查看要写入的文件的inode信息
使用stat LINUX_MUTIL_PROCESS_WRITE_2
命令查看要写入的文件inode信息,可以看到它的值为67728087
。
2 示例程序
下面这个linux_process_fork1_7.c
程序很简单,主要是把p_buf指向的静态区数据写入到文件LINUX_MUTIL_PROCESS_WRITE
中。
为了测试多进程同时写文件的情景,需要复制linux_process_fork1_7.c程序为linux_process_fork1_8.c,同时把p_buf指向改成abcdefghi
,然后分别编译成两个不同的可执行文件:linux_process_fork1_7 和 linux_process_fork1_8。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 | /**
* @FileName linux_process_fork1_7.c
* @Describe Linux C/C++多进程同时写一个文件(三)
* @Author vfhky 2017-10-29 22:23 https://typecodes.com/cseries/linuxmutilprocesswrite3.html
* @Compile gcc linux_process_fork1_7.c -o linux_process_fork1_7
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include "printnolog.h"
#define FILE_NAME "LINUX_MUTIL_PROCESS_WRITE_2"
static const char *p_buf = "123456789";
int main( const int argc, const char * const *argv )
{
int i_fd = open( FILE_NAME, O_RDWR | O_CREAT );
if( -1 == i_fd )
{
PRINTNOLOG( "Open file=[%s] failed, errno=[%d] errmsg=[%s].\n", FILE_NAME, errno, strerror( errno ) );
return -1;
}
static int i_write_len = 0;
for( int i=0; i<10000; i++ )
{
//每次都偏移到文件最末尾
// if( 0 > lseek( i_fd, 0L, SEEK_END ) )
// {
// PRINTNOLOG( "lseek error.\n" );
// return 0;
// }
usleep( 1000 );
i_write_len += write( i_fd, p_buf, strlen( p_buf ) );
}
close( i_fd );
PRINTNOLOG( "i_write_len=[%ld].\n", i_write_len );
return 0;
}
|
3 开始测试
具体的测试过程和第一篇文章一样的:
这里只列出最后的测试结果:两个非亲缘进程分别写入了90000字节,但是文件总共大小还是90000字节。
4 结论
从测试结果可以得出:两个非亲缘关系的进程同时写一个文件时,如果没有设置append同步文件偏移量,那么两个进程写入的数据会出现覆盖的情况。
Comments »