打开文件和文件更新
Open files and file updates
我编写了一个程序,它打开一个文件并重复创建一个子进程,该子进程将文件的内容打印到标准输出。
如果我 运行 这个程序在后台运行并改变文件的内容,新的内容将被打印出来。
但是,如果我删除文件的读取权限或删除文件,程序将不会改变其行为。
我不明白为什么会这样。
这是代码:
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);
谢谢
假设 UNIX/Linux-like 行为:
仅在打开文件时检查文件权限。打开文件后,权限是什么都无关紧要了。
程序在您删除文件后仍然可以读取它,因为如果打开了某个文件,文件本身不会被删除。当您执行 rm
时,只会删除文件的目录条目。通常,当文件的最后一个硬 link 被删除时,文件数据也会被删除。但是,如果一个或多个进程打开了该文件,则该文件(即索引节点)会保留下来,并且仍然可以被这些进程访问。最后一个进程关闭文件后,文件将被删除。
我编写了一个程序,它打开一个文件并重复创建一个子进程,该子进程将文件的内容打印到标准输出。 如果我 运行 这个程序在后台运行并改变文件的内容,新的内容将被打印出来。 但是,如果我删除文件的读取权限或删除文件,程序将不会改变其行为。 我不明白为什么会这样。
这是代码:
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);
谢谢
假设 UNIX/Linux-like 行为:
仅在打开文件时检查文件权限。打开文件后,权限是什么都无关紧要了。
程序在您删除文件后仍然可以读取它,因为如果打开了某个文件,文件本身不会被删除。当您执行 rm
时,只会删除文件的目录条目。通常,当文件的最后一个硬 link 被删除时,文件数据也会被删除。但是,如果一个或多个进程打开了该文件,则该文件(即索引节点)会保留下来,并且仍然可以被这些进程访问。最后一个进程关闭文件后,文件将被删除。