c - 为什么权限参数会影响我的小测试程序中写入文件的内容?
问题描述
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/wait.h>
int main(int argc, char* argv[]) {
int rc = fork();
// if I uncomment this line, the output file's is "testtest" when program exits.
// int file = open("./output", O_CREAT|O_WRONLY|O_TRUNC, S_IRUSR|S_IWUSR);
// Use this line, the output file contains the string "TESTTEST".
int file = open("./output", O_CREAT|O_WRONLY|O_TRUNC);
if (rc < 0) {
fprintf(stderr, "fork failed\n");
exit(1);
} else if (rc == 0) {
write(file, "testtest", 8);
close(file);
} else {
write(file, "TESTTEST", 8);
close(file);
int wc = waitpid(rc, NULL, 0);
}
return 0;
}
我写了一个小程序来练习Linux API,然后遇到一个看不懂的问题。
当我传递权限参数时,我只能在子进程中写入内容。但是当我切换到另一个打开的函数时,我只能在父进程中写入内容。
有人可以帮忙解释为什么吗?我可以在输出文件中同时获得“TESTEST”和“testtest”吗?
解决方案
因为,每个进程都有一个每个进程的文件表,当一个进程打开一个文件时,它会在文件表中为该打开的文件创建一个新条目。此条目包含有关文件的一些信息,包括该文件中光标的当前位置。最初,此光标指向文件的第一个字节。当创建一个新的子进程时,它会复制其父进程的文件表。
在您的情况下,父进程和子进程都有文件“输出”的文件表条目,并且两者都将指向该文件的初始字节。如果父级先写入(取决于调度),它将在文件上写入“TESTTEST”并将其文件表中的光标移动到前面的 8 个位置。但是子文件表的光标仍然指向同一个文件的起始字节。它用“testtest”替换了父母的书面数据。如果孩子先写,那么同样的事情将以相反的顺序发生——“testtest”将被“TESTTEST”替换。
推荐阅读
- python - 数字过滤算法错误
- apache-flink - Kubernetes 上的 Flink JobManager HA
- php - 如何检查默认情况下设置了(int)数组键还是自定义(int)键?
- php - 删除文件dropzone js laravel错误500
- mysql - ER_BAD_FIELD_ERROR:“on 子句”中的未知列“table.column”
- html - 雨果主题网页未按预期呈现某些元素(使用 Netlify)
- javascript - 渲染元素时遇到问题
- android - Android Studio for Mac:使用原始彩色图像作为初始屏幕
- d3.js - 你能在 .nest() 中使用 if 语句吗?如果不是,将标签分配给数组元素以使其适合多个组的最佳方法是什么
- javascript - 如何修复控制台警告“资源...已使用链接预加载进行预加载,但在窗口加载事件后的几秒钟内未使用”?