打开文件和文件更新

时间:2016-12-04 20:44:02

标签: c linux filesystems fork

我编写了一个打开文件并重复创建子进程的程序,该进程将文件内容打印到标准输出。 如果我在后台运行此程序并更改文件的内容,则将打印新内容。 但是,如果我删除文件的读取权限或删除文件,程序将不会更改其行为。 我不明白为什么会这样。

这是代码:

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 个答案:

答案 0 :(得分:1)

假设类似UNIX / Linux的行为:

仅在打开文件时检查文件权限。打开文件后,权限不再重要。

程序在删除后仍然可以读取文件,因为如果文件打开了,文件本身就不会被删除。执行rm时,只删除文件的目录条目。通常,当删除文件的最后一个硬链接时,也会删除文件数据。但是,如果一个或多个进程打开文件,则文件(即inode)仍然存在,并且仍然可以被这些进程访问。一旦最后一个进程关闭文件,该文件就会被删除。