1. 作用
1.1 函数原型
int fcntl(int fd,int cmd);
int fcntl(int fd,int cmd,long arg);
int fcntl(int fd,int cmd,struct flock *lock);
- fd:文件描述符
- cmd:命令选项,常见的有以下可选值
- F_DUPFD:复制一个现有的描述符
- F_GETFL:获得文件状态标记
- F_SETFL:设置文件状态标记
- F_GETOWN:获取异步I/O所有权
- F_SETOWN:设置异步I/O所有权
- F_GETLK:获取记录锁状态
- F_SETLK:设置记录锁状态
- F_SETLKW:设置记录锁状态,
- lock:结构体,保存锁的信息
struct flock {
...
short l_type;
short l_whence;
off_t l_start;
off_t l_len;
pid_t l_pid;
...
};
fcntl支持的常用操作及其参数
| 操作 | 含义 | 第三个参数类型 | 第三个参数的取值 | 成功时返回的值 |
| F_DUPFD | 复制一个文件描述符,新的文件描述符其值大于或等于arg | long | 数值 | 新创建的文件描述符 |
| F_GETFL | 获取fd的状态标志。 | 空 | | fd的状态标志(位图) |
| F_SETFL | 设置fd的状态标志 | long | fd的新的状态标志(位图) | 0 |
| F_GETLK | 获取fd的记录锁信息 | 空 | | 0 |
| F_SETLK | 设置文件的记录锁(非阻塞) | flock | | 0 |
| F_SETLKW | 设置文件的记录锁(阻塞) | flock | | 0 |
2. 进程间对同一个文件加记录锁
#include
#include
#include
#include
#include
#include
void sys_err(char *str)
{
perror(str);
exit(1);
}
int main(int argc, char *argv[])
{
int fd;
struct flock f_lock;
if (argc < 2) {
printf("./a.out filenamen");
exit(1);
}
if ((fd = open(argv[1], O_RDWR)) < 0)
sys_err("open");
f_lock.l_type = F_WRLCK;
// f_lock.l_type = F_RDLCK;
f_lock.l_whence = SEEK_SET;
f_lock.l_start = 0;
f_lock.l_len = 0;
fcntl(fd, F_SETLKW, &f_lock);
printf("get flockn");
sleep(10);
f_lock.l_type = F_UNLCK;
fcntl(fd, F_SETLKW, &f_lock);
printf("un flockn");
close(fd);
return 0;
}