gpt4 book ai didi

c - 打开文件和文件更新

转载 作者:太空宇宙 更新时间:2023-11-04 10:27:52 26 4
gpt4 key购买 nike

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

这是代码:

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 行为:

只有在打开文件时才会检查文件权限。打开文件后,权限是什么就不再重要了。

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

关于c - 打开文件和文件更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40963430/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com