本文是这《Linux C/C++多进程同时写一个文件》系列文章的第三篇,上一篇文章演示了两个亲缘关系的进程(父子进程)同时写一个文件的情形,并得出了数据只会错乱但不会覆盖
的结论。这篇文章主要是在第一篇文章的基础上,加上上篇文章的分析,更深下一步地探索两个非亲缘关系的进程同时写一个文件的问题。
使用stat LINUX_MUTIL_PROCESS_WRITE_2
命令查看要写入的文件inode信息,可以看到它的值为67728087
。
下面这个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; } |
---|
具体的测试过程和第一篇文章一样的:
这里只列出最后的测试结果:两个非亲缘进程分别写入了90000字节,但是文件总共大小还是90000字节。
从测试结果可以得出:两个非亲缘关系的进程同时写一个文件时,如果没有设置append同步文件偏移量,那么两个进程写入的数据会出现覆盖的情况。