文件I/O-fcntl

定义

函数声明

flock结构体



建议锁


强制锁


实例

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/file.h>
void lock_set(int fd, int type)
{
// 设置lock结构体
struct flock lock;
lock.l_whence = SEEK_SET;
lock.l_start = 0;
lock.l_len = 0;
lock.l_type = type;
// 根据不同的type值, 设置文件锁
if (fcntl(fd, F_SETLK, &lock) == 0)
{
if (lock.l_type == F_RDLCK)
{
printf("read lock already set by %d.\n", getpid());
}
else if (lock.l_type == F_WRLCK)
{
printf("write lock already set by %d.\n", getpid());
}
else if (lock.l_type == F_UNLCK)
{
printf("release lock by %d\n", getpid());
}
else
{
printf("error l_type.\n");
}
}
else
{
// 判断文件不能设置锁的原因
fcntl(fd, F_GETLK, &lock);
/*判断文件不能上锁的原因*/
if(lock.l_type == F_UNLCK)
printf("no lock by %d\n",lock.l_pid);
/*/该文件已有写入锁*/
if(lock.l_type == F_RDLCK)
printf("read lock already set by %d\n",lock.l_pid);
/*该文件已有读取锁*/
else if(lock.l_type == F_WRLCK)
printf("write lock already set by %d\n",lock.l_pid);
}
}
void lock_get(int fd)
{
// 设置flock结构体
struct flock lock;
lock.l_whence = SEEK_SET;
lock.l_start = 0;
lock.l_len = 0;
lock.l_type = F_RDLCK;
// 判断文件是否上锁
if (fcntl(fd, F_GETLK, &lock) < 0)
{
printf("get lock failure by %d \n", getpid());
}
// 判断文件不能上锁的原因
if (lock.l_type == F_UNLCK)
{
printf("no lock by %d\n", lock.l_pid);
}
// 该文件已有写入锁
else if (lock.l_type == F_RDLCK)
{
printf("read lock already set by %d", lock.l_pid);
}
// 该文件已有读取锁
else if (lock.l_type == F_WRLCK)
{
printf("write lock already set by %d", lock.l_pid);
}
}
int main(int argc, char *argv[])
{
// 打开文件
int fd;
fd = open(argv[1], O_CREAT | O_RDWR | O_TRUNC, 0666);
if (fd == -1)
{
perror("Error open func.\n");
exit(EXIT_FAILURE);
}
// 选择功能
int type;
switch (argv[2][0])
{
case 'w': // 写锁
type = F_WRLCK;
break;
case 'r': // 读锁
type = F_RDLCK;
break;
case 'u': // 解锁
type = F_UNLCK;
break;
case 'g': // 获取锁状态
type = 0;
break;
default:
break;
}
if (type == 0)
{
lock_get(fd);
}
else
{
lock_set(fd, type);
}
// 关闭文件
close(fd);
exit(EXIT_SUCCESS);
}
posted @   steve的miao  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示