gpt4 book ai didi

更改子进程的偏移量

转载 作者:太空宇宙 更新时间:2023-11-04 06:56:32 25 4
gpt4 key购买 nike

假设我有一个父进程,然后创建一些子进程以便从同一个文件中读取。

  1. 当每个进程从文件描述符中读取时,其所有兄弟进程之间的偏移量是否已更改?

  2. 那么,是否有可能每个进程都会读取一个唯一的行,或者如果没有同步应用程序,每个进程都会像他的 sibling 一样读取相同的行?

    id = fork();

    if (id < 0)
    exit(EXIT_FAILURE);

    if (pipe(fd) == -1)
    exit(EXIT_FAILURE);

    switch (id) {
    case 0:
    //child process
    readFromFile(filename);
    exit(0);
    break;
    default:
    //Parent process doing something..
    break;
    }

最佳答案

在 POSIX 系统上,子进程通过 fork 调用继承的文件描述符引用 系统范围 表中的相同文件描述符。以下是 Linux 手册页中有关 open(2) 的相关引述:

The term open file description is the one used by POSIX to refer to the entries in the system-wide table of open files... When a file descriptor is duplicated (using dup(2) or similar), the duplicate refers to the same open file description as the original file descriptor, and the two file descriptors consequently share the file offset and file status flags. Such sharing can also occur between processes: a child process created via fork(2) inherits duplicates of its parent's file descriptors, and those duplicates refer to the same open file descriptions.

这意味着父进程和子进程在文件偏移量上共享相同的信息,读入一个文件会改变所有其他进程看到的偏移量。如果进程在读取之间没有 lseeking 的情况下并行读取,则没有两个进程会读取相同的数据。

您可以在下面的测试程序中看到这一点,它打印命令行中给定文件的前 20 个字符。 (如果不共享位置信息,它将打印前 10 个字符两次)。

#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

char buffer[256];

int
main(int argc, char ** argv)
{
int fd = open(argv[1], O_RDONLY);
fork();
read(fd, buffer, 10);
write(1, buffer, 10);
return 0;
}

HOWEVER,这是一个巨大的“然而”,这只适用于读取文件的低级系统调用接口(interface):open(2)read(2) 等。如果您使用更高级别的缓冲接口(interface),如 fgetsstdio.h 中的其他函数,事情会变得复杂.当进程被 fork 时,即使它们继承了指向单个系统范围的文件描述符的副本,内核中文件信息的共享结构,它们也继承了单独的用户空间缓冲信息副本由 stdio.h 调用使用,并且此缓冲信息包括它自己的偏移量(显然还有缓冲区),它们在进程之间不同步。

关于更改子进程的偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43708287/

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