簡體   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