繁体   English   中英

如何从C中的两个不同程序对文本文件进行并发读写操作

[英]How to apply concurrent read and write operation on a text file from two different program in c

我正在从一个应用程序写入文本文件,而另一个应用程序正在读取文本文件。在读写时是否需要使用信号量或文件锁定?

我在谷歌中搜索,发现需要一些所说的同步。如果需要同步,则最好在信号量或文件锁定之间进行同步。

从一个应用程序写入文件。

    fp = fopen(status_info_dir, "w");

    if (fp)
    {
        for (i = 0; i < USER_NUMBER; i++)
        {
            CurrentUser = userArray[i];

            if (CurrentUser)
            {
                fprintf(fp, "Usr indx: %d, %s, IP:%s\n",
                        i, CurrentUser->macAddress, CurrentUser->ipAddress);
            }
        }

        fclose(fp);
    }

   //reading file from another application and find sometimes data loss 
   //while reading.

    while (fgets(statusFileInfo, 255, fp) != NULL)
    {
       if (strcmp(statusFileInfo, "\n") == 0)
           continue;
       printf("%s\n", statusFileInfo);
    } 

读写时是否需要使用信号量或文件锁定?

不一定,但是您可能需要某种形式的同步。

如果需要同步,则最好在信号量或文件锁定之间进行同步。

这取决于您需要做什么和您的环境。 有许多方法可以执行IPC和同步过程。

如果如标签所示,您使用的是Linux,则只关心本地文件系统,并且想要一个相当简单的解决方案,然后尝试文件锁定,例如使用lockf 如果需要,也许可以利用部分。

如果共享资源是文件中的数据,则使用文件锁定似乎更为自然,因为它允许您定义和保护文件区域(在文件中的字节偏移量之间),并且可以锁定读取(允许多个读取器访问)或写作(带有排他锁)。 而且文件锁定可以通过NFS进行,因此您可以透明地锁定通过网络访问的文件(信号灯与共享资源中涉及的所有进程都必须在同一台计算机上),而且文件锁定不需要以获取额外的资源(作为另一种信号量),因为一切都通过您要访问的文件的文件描述符完成。

由于您没有告诉我们您将要执行的访问类型,因此我无法再说太多了……但是您没有提到第三种感兴趣的情况,但是如果满足某些条件,也可以作为解决方案:一个进程是读取器,另一个进程是写入器,而您使用文件只是将数据从一个进程传递到另一个进程,也许pipe是最佳选择。例如,如果读者不准备处理更多数据,并且没有无限期地增长,那么它就会阻塞作者,就像您计划在两者之间共享大量数据的情况一样。

如果需要双向通信,则解决方案应该是unix套接字。 在此基础上,两个进程均获取一个套接字。 他们连接两个插座,然后可以在其插座上进行读取或写入。 他们写的内容由另一个进程从另一个套接字读取。 他们读取的内容来自另一个套接字上的写入数据。

Linux中的信号量是从At&t UNIX SysV信号量派生的,并且有点难以学习(我读过很多书,其中的作者大胆地描述了如何使用它们,因为API太复杂了)信号量是以数组形式获取的(几个信号量)每个请求),并允许在进程死亡的情况下进行解锁,您可以对它们进行编程,以撤消对信号量所做的所有锁定。 阅读手册页后,您可能会决定使用其他替代方法。

无论如何,您需要知道文件锁定从来都不是强制性的,尝试访问共享区域时您的进程将被阻塞,但是只有在您调用锁定调用,要与其他不知道该文件的其他程序一起运行程序时,才会被阻塞。锁定机制,那么内核将不会增强访问权限,您将陷入混乱。

就是这样,伙计们!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM