首页 > 解决方案 > 为什么权限参数会影响我的小测试程序中写入文件的内容?

问题描述

#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”吗?

标签: clinuxfork

解决方案


因为,每个进程都有一个每个进程的文件表,当一个进程打开一个文件时,它会在文件表中为该打开的文件创建一个新条目。此条目包含有关文件的一些信息,包括该文件中光标的当前位置。最初,此光标指向文件的第一个字节。当创建一个新的子进程时,它会复制其父进程的文件表。

在您的情况下,父进程和子进程都有文件“输出”的文件表条目,并且两者都将指向该文件的初始字节。如果父级先写入(取决于调度),它将在文件上写入“TESTTEST”并将其文件表中的光标移动到前面的 8 个位置。但是子文件表的光标仍然指向同一个文件的起始字节。它用“testtest”替换了父母的书面数据。如果孩子先写,那么同样的事情将以相反的顺序发生——“testtest”将被“TESTTEST”替换。


推荐阅读