2016-12-04 73 views
0

我寫了一個程序,它打開一個文件並反覆創建一個將文件內容打印到標準輸出的子進程。 如果我在後臺運行此程序並更改文件的內容,將打印新內容。 但是,如果我刪除文件的讀取權限或刪除文件,程序將不會更改其行爲。 我不明白爲什麼會發生這種情況。打開文件和文件更新

這是代碼:

fd = open(argv[1], O_RDONLY); 
    if (fd == -1) { 
    perror("catloop: open"); 
    return EXIT_FAILURE; 
    } 

    while (1) { 
    pid = fork(); 

    if (pid == -1) { 
     perror("catloop: fork"); 
     (void) close(fd); 
     return EXIT_FAILURE; 
    } 

    if (pid == 0) { 
     char c; 
     (void) lseek(fd, 0, SEEK_SET); 

     while (read(fd, &c, 1) == 1) { 
     write(STDOUT_FILENO, &c, 1); 
     } 

     (void) close(fd); 
     return EXIT_SUCCESS; 
    } 

    (void) waitpid(pid, NULL, 0); 
    sleep(1); 
    } 

    (void) close(fd); 

謝謝

回答

1

假設UNIX類Linux /行爲:

文件打開時,文件權限只檢查。一旦你打開了文件,不管什麼權限了。

程序仍然可以在刪除文件後讀取該文件,因爲如果文件打開,文件本身不會被刪除。當您執行rm時,只會刪除該文件的目錄條目。通常,當去除文件的最後一個硬鏈接時,文件數據也會被刪除。但是,如果一個或多個進程打開該文件,則該文件(即inode)仍然存在,並且仍然可以由這些進程訪問。一旦最後一個進程關閉文件,該文件就被刪除。

+0

爲什麼當我們追加文件的內容時,新的內容將被打印? – user3142443

+1

在循環的每次迭代中,您都會尋找文件的開頭並讀到最後,這樣文件中的任何內容都會被打印出來。爲什麼這種行爲讓你感到驚訝? –