我目前正在开发一个分叉服务器,它为客户端提供块级(有一个定义的块大小并检查边界)对文件的读写访问权。
我正在为每个客户端连接创建一个fork。我知道文件句柄被复制,因此父进程和子进程都可以访问该文件。我也知道在一个过程中寻求也会影响其他过程。
所以这是我的问题:
感谢您的帮助:)
答案 0 :(得分:0)
使用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()
写入文件中的某个位置而不影响文件指针。