分叉服务器,单个文件 - r/w 访问

Forking server, single file - r/w access

本文关键字:访问 文件 服务器 单个 分叉      更新时间:2023-10-16

我目前正在开发一个分叉服务器,它为客户端提供块级(有一个定义的块大小并检查边界)对文件的读写访问权限。

我正在为每个客户端连接创建一个分支。我知道文件句柄是复制的,因此父进程和子进程都可以访问该文件。我也知道,在一个过程中寻求也会影响其他过程。

所以这是我的问题:

    如何在前叉
  1. 中锁定寻找物与其他前叉?互斥体?
  2. 一个分叉可以写入某些块,而其他分叉正在读取不同的块吗?
  3. 如果 2 是可能的,如何防止分叉读取当前正在写入的块?

感谢您的帮助:)

使用 lockf() 锁定每个进程中要写入的文件块。

由于要锁定的部分从当前文件偏移量开始,我认为最好在每个进程中单独打开文件,而不是共享相同的文件句柄。这样,您可以在每个过程中寻找,而不会影响其他过程。否则,除了文件锁定之外,您还需要围绕lseek()进行互斥。

因此,要写入块的代码如下所示:

lseek(fd, block_pos, SEEK_SET);
lockf(fd, F_LOCK, block_size);
write(fd, buf, block_size);
lseek(fd, block_pos, SEEK_SET);
lockf(fd, F_ULOCK, block_size);

如果使用共享文件句柄,则可以使用 fcntl() 在调用中指定的偏移量处设置锁,pwrite()写入文件中的某个位置,而不会影响文件指针。