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

Forking server, single file - r/w access

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

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

所以这是我的问题:

  1. 如何在分叉中锁定seeking来对抗其他分叉?互斥体?
  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() 写入文件中的某个位置而不影响文件指针。