【问题标题】:Why will the permission argument affect the content written to file in my small test program?为什么权限参数会影响我的小测试程序中写入文件的内容?
【发布时间】:2020-01-04 09:16:00
【问题描述】:
#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”吗?

【问题讨论】:

  • 你有一个竞争条件。没有指定父母或孩子是否赢得比赛,可能是随机的。
  • 什么是你的“许可参数”?
  • S_IRUSR|S_IWUSR
  • 实际上是错误的副本。
  • O_CREAT 要求您将第三个参数传递给 open。

标签: c linux fork


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-02
    • 2017-02-04
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多