2016-12-04 74 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

在循环的每次迭代中,您都会寻找文件的开头并读到最后,这样文件中的任何内容都会被打印出来。为什么这种行为让你感到惊讶? –