面试题答案
一键面试实现思路
- 获取文件描述符:通过
open
函数打开要操作的文件,得到文件描述符fd
。 - 定义锁结构:使用
struct flock
结构体来设置锁的类型(读锁、写锁等)、作用范围等信息。 - 设置锁操作:通过
fcntl
函数的F_SETLK
或F_SETLKW
命令来设置文件锁。F_SETLK
是非阻塞的,如果锁不能立即获取则返回 -1;F_SETLKW
是阻塞的,会等待直到锁可以获取。 - 文件操作:在获取到锁后,进行文件的读写操作。
- 释放锁:使用
fcntl
函数的F_SETLK
命令,并将锁类型设置为F_UNLCK
来释放文件锁。
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
int main() {
int fd;
struct flock lock;
// 打开文件
fd = open("test.txt", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
if (fd == -1) {
perror("open");
exit(EXIT_FAILURE);
}
// 设置写锁
lock.l_type = F_WRLCK;
lock.l_whence = SEEK_SET;
lock.l_start = 0;
lock.l_len = 0; // 整个文件
// 尝试获取写锁,阻塞方式
if (fcntl(fd, F_SETLKW, &lock) == -1) {
perror("fcntl F_SETLKW");
close(fd);
exit(EXIT_FAILURE);
}
// 获取到锁后进行文件写操作
const char *message = "Hello, file locking!";
if (write(fd, message, strlen(message)) == -1) {
perror("write");
}
// 释放写锁
lock.l_type = F_UNLCK;
if (fcntl(fd, F_SETLK, &lock) == -1) {
perror("fcntl F_SETLK");
}
close(fd);
return 0;
}
在上述代码中:
- 首先通过
open
函数打开文件test.txt
,如果文件不存在则创建。 - 然后设置
struct flock
结构体lock
,指定要获取写锁。 - 使用
fcntl
函数以阻塞方式获取写锁。 - 获取到锁后进行文件写操作。
- 最后释放写锁并关闭文件。
如果是读锁操作,只需将 lock.l_type
设置为 F_RDLCK
即可。读锁允许多个进程同时读取文件,但会阻止写操作,直到所有读锁被释放。写锁则会阻止其他进程的读和写操作。