在Linux中,open()
函數用于打開一個文件并返回一個文件描述符
fcntl()
系統調用:fcntl()
系統調用可以用來操作文件描述符,包括獲取和設置文件鎖。以下是一個使用fcntl()
獲取文件鎖的示例:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/file.h>
int main(int argc, char *argv[]) {
int fd;
struct flock lock;
if (argc != 2) {
fprintf(stderr, "Usage: %s <file>\n", argv[0]);
exit(EXIT_FAILURE);
}
fd = open(argv[1], O_RDWR);
if (fd == -1) {
perror("open");
exit(EXIT_FAILURE);
}
memset(&lock, 0, sizeof(lock));
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");
exit(EXIT_FAILURE);
}
// 在此處進行文件操作
lock.l_type = F_UNLCK; // 釋放鎖
if (fcntl(fd, F_SETLK, &lock) == -1) {
perror("fcntl");
exit(EXIT_FAILURE);
}
close(fd);
return 0;
}
flock()
系統調用:flock()
系統調用允許你鎖定文件的特定部分或整個文件。以下是一個使用flock()
獲取文件鎖的示例:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/file.h>
int main(int argc, char *argv[]) {
int fd;
if (argc != 2) {
fprintf(stderr, "Usage: %s <file>\n", argv[0]);
exit(EXIT_FAILURE);
}
fd = open(argv[1], O_RDWR);
if (fd == -1) {
perror("open");
exit(EXIT_FAILURE);
}
if (flock(fd, LOCK_EX) == -1) { // 獲取獨占鎖
perror("flock");
exit(EXIT_FAILURE);
}
// 在此處進行文件操作
if (flock(fd, LOCK_UN) == -1) { // 釋放鎖
perror("flock");
exit(EXIT_FAILURE);
}
close(fd);
return 0;
}
在這兩個示例中,我們首先使用open()
函數打開一個文件,然后使用fcntl()
或flock()
系統調用獲取文件鎖。在文件操作完成后,我們需要釋放文件鎖,然后關閉文件描述符。