2016-12-04 7 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を実行すると、ファイルのディレクトリエントリが削除されます。通常、ファイルへの最後のハードリンクが削除されると、ファイルデータも削除されます。しかし、1つまたは複数のプロセスがそのファイルをオープンしている場合、そのファイル(すなわち、iノード)は残っており、それらのプロセスによって依然としてアクセス可能である。最後のプロセスがファイルを閉じると、ファイルは削除されます。

+0

なぜファイルの内容を追加すると、新しい内容が印刷されるのですか? – user3142443

+1

ループの繰り返しごとに、ファイルの先頭に移動して最後まで読み取ります。そのため、ファイル内の内容がすべて印刷されます。なぜあなたの行動はあなたを驚かせるでしょうか? –

関連する問題