gpt4 book ai didi

c - [APUE]fork后parent和child共享相同的文件偏移量吗?

转载 作者:太空狗 更新时间:2023-10-29 14:55:45 25 4
gpt4 key购买 nike

在APUE section 8.3 fork function中,关于父子进程之间的文件共享,
它说:父子共享相同的文件偏移量很重要。

而在 8.9 节 Race Conditions 中,有一个例子: parent 和 child 都写入
在调用 fork 函数之前打开的文件。该程序包含竞争条件,
因为输出取决于内核运行进程的顺序以及每个进程运行的时间。

但是在我的测试代码中,输出是重叠的。

[Langzi@Freedom apue]$ cat race.out
this is a long long outputhis is a long long output from parent

看起来 parent 和 child 有不同的文件偏移量而不是共享相同的偏移量。

我的代码有错误吗?还是我理解错了sharing offset的意思?
任何建议和帮助将不胜感激。

以下是我的代码:

#include "apue.h"
#include <fcntl.h>

void charatatime(int fd, char *);

int main()
{
pid_t pid;
int fd;
if ((fd = open("race.out", (O_WRONLY | O_CREAT | O_TRUNC),
S_IRUSR | S_IWUSR)) < 0)
err_sys("open error");

if ((pid = fork()) < 0)
err_sys("fork error");
else if (pid == 0)
charatatime(fd, "this is a long long output from child\n");
else
charatatime(fd, "this is a long long output from parent\n");

exit(0);
}


void charatatime(int fd, char *str)
{
// try to make the two processes switch as often as possible
// to demonstrate the race condition.
// set synchronous flag for fd
set_fl(fd, O_SYNC);
while (*str) {
write(fd, str++, 1);
// make sure the data is write to disk
fdatasync(fd);
}
}

最佳答案

父子在内核中共享同一个文件表条目,其中包括偏移量。那么,如果没有一个或两个进程关闭并重新打开文件,父进程和子进程不可能有不同的偏移量。因此,父级的任何写入都使用此偏移量并修改(增加)偏移量。然后 child 的任何写入都使用新的偏移量,并修改它。一次写入一个字符会加剧这种情况。

来 self 的 write(2) 手册页:“文件偏移量的调整和写入操作作为一个原子步骤执行。”

因此,您可以保证,任何一个(父或子)的写入都不会覆盖另一个的写入。您还可以注意到,如果您要一次 write(2) 整个句子(在一次调用 write(2) 中),则可以保证句子将一起写成一个片段。

实际上,很多系统都是这样写日志文件的。许多相关进程(同一父进程的子进程)将具有由父进程打开的文件描述符。只要他们每个人一次写一整行(一次调用 write(2)),日志文件就会按照您的意愿读取。一次写一个字符不会有相同的保证。使用输出缓冲(例如,stdio)将同样取消保证。

关于c - [APUE]fork后parent和child共享相同的文件偏移量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1636055/

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