TypeCodes

Linux C/C++多进程同时写一个文件(三)

本文是这《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 开始测试

具体的测试过程和第一篇文章一样的:

Linux C/C++多进程同时写一个文件

Linux C/C++多进程同时写一个文件

这里只列出最后的测试结果:两个非亲缘进程分别写入了90000字节,但是文件总共大小还是90000字节。

Linux C/C++多进程同时写一个文件

4 结论

从测试结果可以得出:两个非亲缘关系的进程同时写一个文件时,如果没有设置append同步文件偏移量,那么两个进程写入的数据会出现覆盖的情况。

打赏支持

Comments »