2013-10-17 142 views
1

請參閱下面的代碼。在Linux中同步讀取文件C

#include <stdio.h>  
#include <fcntl.h>  
#include <stdlib.h>  
#include <string.h>  

int main(int argc,char **argv,char **envp) 
{ 
    int fd; 
    size_t sz; 
    char filebuffer[1024]; 
    int loop; 
    fd=open("sample",O_RDONLY); 
    if(fd==-1) 
    { 
     perror(""); 
     exit(1); 
    } 
    loop=0; 
    while(++loop<300) 
    { 
     lseek(fd,0,SEEK_SET); 
     memset(filebuffer,0,1024); 
     sz=read(fd,filebuffer,1024); 
     printf("%d.sz=%zd\t%s\n",loop,sz,filebuffer); 
     sleep(1); 
    } 
    close(fd); 
    return 0; 
} 

在這段代碼中,我能夠讀取文件。但是當我在閱讀過程中同時更換文件(閱讀文件「sample」)時。然後我無法讀取更改的文件。我也嘗試了O_SYNC標誌。但仍然無法正常工作,但O_DIRECT未定義錯誤即將到來。我如何確保能夠閱讀更改?第二件事,但我觀察到,如果我關閉並打開文件閱讀,那麼我可以閱讀更改的文件。

問題:
如何在不關閉和打開的情況下讀取更改的文件?

+1

你說,「當我改變文件」*你究竟在做什麼「改變」?另一個過程?另一個線程?網絡捲上的另一臺*機器* – WhozCraig

+0

我在Ubuntu的opend終端,我在那裏,在同一臺機器。 –

+1

不要在尖括號內包含空格;這是非常傳統的,我不相信編譯器有義務正確處理這種使用。 (在_h-char-sequence_中允許使用空格(請參閱第6.4.2節標題名稱和第6.10.2節源文件包含),但標準標題的名稱總是以空格寫入 - 無論您如何處理(Mac OS X上的GCC 4.8.1拒絕帶空格的標題) –

回答

0

這是你的代碼的適應。它分叉創造兩個過程。子代碼包含您的代碼,基本不變(不同的錯誤消息,文件名變量,以及更多打印不爲空的filebuffer)。父母將字符(相同的字符,一遍又一遍)寫入文件。

#include <fcntl.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 

static char const filename[] = "sample"; 

int main(void) 
{ 
    int fd; 
    size_t sz; 
    char filebuffer[1024]; 
    int loop; 

    switch (fork()) 
    { 
    case -1: 
     fprintf(stderr, "Failed to fork\n"); 
     break; 

    case 0: 
     sleep(1); 
     fd = open(filename, O_RDONLY); 
     if (fd == -1) 
     { 
      fprintf(stderr, "Failed to open file %s for reading\n", filename); 
      exit(1); 
     } 
     loop = 0; 
     while (++loop < 300) 
     { 
      lseek(fd, 0, SEEK_SET); 
      memset(filebuffer, 0, 1024); 
      sz = read(fd, filebuffer, 1024); 
      printf("%d.sz=%zd\t%.*s\n", loop, sz, (int)sz, filebuffer); 
      sleep(1); 
     } 
     close(fd); 
     break; 

    default: 
     fd = open(filename, O_WRONLY|O_CREAT, 0644); 
     if (fd == -1) 
     { 
      fprintf(stderr, "Failed to create file %s for writing\n", filename); 
      exit(1); 
     } 
     for (loop = 0; loop < 256; loop++) 
     { 
      memset(filebuffer, (loop % 64) + 33, sizeof(filebuffer)); 
      lseek(fd, 0L, SEEK_SET); 
      write(fd, filebuffer, sizeof(filebuffer)); 
      sleep(1); 
     } 
     close(fd); 
     break; 
    } 

    return 0; 
} 

輸出示例:

1.sz=1024 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 
2.sz=1024 ################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################ 
3.sz=1024 ################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################ 
4.sz=1024 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
5.sz=1024 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 
6.sz=1024 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
7.sz=1024 ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
8.sz=1024 ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
9.sz=1024 **************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** 

正如你所看到的,進程異步運行,所以文件中的數據並不總是讀之間變化,但過程是看到的變化。

嘗試在您的計算機上運行此操作。它應該工作。 (Mac OS X 10.8.5的輸出示例)如果沒有,則需要確定您擁有哪種文件系統類型,但我認爲這不是問題。

1

我覺得你問以下問題:

我有打開一個名爲sample文件,並反覆讀取該文件的第一個塊的程序。這工作正常。但是,如果我編輯文件sample,例如使用文本編輯器,則我的程序看不到更改,但如果它關閉並重新打開該文件,它將會發生。如何在不關閉並重新打開文件的情況下查看更改?

如果這是你的問題,那麼答案是:

對不起,你不能,因爲文本編輯器沒有修改該文件。它創建一個新文件舊名稱

在Unix中,一旦你打開了一個文件,它將不會被刪除,即使它的名字是未鏈接的。如果另一個程序「刪除」該文件,然後創建一個具有相同名稱的新文件,則您打開的文件將不再可供任何其他程序訪問,但它仍然是,並且它不會被刪除,直到您關閉它。

大多數Unix文本工具,甚至是那些聲稱「in-place」工作的文本工具(如sed -i)都不會修改文件。包括文本編輯器。因此,您的程序不會看到文件中的更改,因爲文件不會更改;該名稱已被賦予新文件。

所以處理這個問題的唯一方法是關閉並重新打開文件。當您重新打開時,您將以舊名稱打開新文件。