概述
fcntl 函数语法要点
所需头文件
#include <sys/types.h>函数原型
#include <unistd.h>
#include <fcntl.h>
int fcnt1(int fd, int cmd, struct flock *lock)函数传入值
fd: 文件描述符函数返回值
cmd:
F_DUPFD:复制文件描述符Lock: 结构为 flock,设置记录锁的具体状态,后面会详细说明
F_GETFD:获得 fd 的 close-on-exec 标志,若标志未设置,则文件经过 exec函数之后仍保持打开状态
F_SETFD:设置 close-on-exec 标志,该标志以参数 arg 的 FD_CLOEXEC 位决定
F_GETFL:得到 open 设置的标志
F_SETFL:改变 open 设置的标志
F_GETFK:根据 lock 描述,决定是否上文件锁
F_SETFK:设置 lock 描述的文件锁
F_SETLKW:这是 F_SETLK 的阻塞版本(命令名中的 W 表示等待(wait) 。)如果存在其他锁,则调用进程睡眠;如果捕捉到信号则睡眠中断
F_GETOWN:检索将收到 SIGIO 和 SIGURG 信号的进程号或进程组号
F_SETOWN:设置进程号或进程组号
struct flock {
short l_type;}
off_t l_start;
short l_whence;
off_t l_len;
pid_t l_pid;
lock 结构变量取值
l_type:
F_RDLCK:读取锁(共享锁)l_stat:
F_WRLCK:写入锁(排斥锁)
F_UNLCK:解锁
相对位移量(字节)l_whence:相对位移量的起点(同 lseek的 whence)。
SEEK_SET:当前位置为文件的开头,新位置为偏移量的大小l_len:
SEEK_CUR:当前位置为文件指针的位置,新位置为当前位置加上偏移量
SEEK_END:当前位置为文件的结尾,新位置为文件的大小加上偏移量的大小
加锁区域的长度为加锁整个文件,通常的方法是将 l_start 说明为 0, l_whence 说明为 SEEK_SET, l_len 说明为 0。
成功: 0
出错:-1
fcntl 使用实例
/*lock_set 函数*/
void lock_set(int fd, int type)
{
struct flock lock;
lock.l_whence = SEEK_SET;//赋值 lock 结构体
lock.l_start = 0;
lock.l_len =0;
while(1)
{
lock.l_type = type;
/*根据不同的 type 值给文件上锁或解锁*/
if((fcntl(fd, F_SETLK, &lock)) == 0)
{
if( lock.l_type == F_RDLCK )
printf("read lock set by %dn",getpid());
else if( lock.l_type == F_WRLCK )
printf("write lock set by %dn",getpid());
else if( lock.l_type == F_UNLCK )
printf("release lock by %dn",getpid());
return;
}
/*判断文件是否可以上锁*/
fcntl(fd, F_GETLK,&lock);
/*判断文件不能上锁的原因*/
if(lock.l_type != F_UNLCK){
/*/该文件已有写入锁*/
if( lock.l_type == F_RDLCK )
printf("read lock already set by %dn",lock.l_pid);
/*该文件已有读取锁*/
else if( lock.l_type == F_WRLCK )
printf("write lock already set by %dn",lock.l_pid);
getchar();
}
}
}
下面的实例是测试文件的写入锁,这里首先创建了一个 hello 文件,之后对其上写入锁,最后释放写入锁。代码如下所示:
/*fcntl_write.c 测试文件写入锁主函数部分*/
#include <unistd.h>
#include <sys/file.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int fd;
/*首先打开文件*/
fd = open("hello",O_RDWR | O_CREAT, 0666);
if(fd < 0)
{
perror("open");
exit(1);
}
/*给文件上写入锁*/
lock_set(fd, F_WRLCK);
getchar();
/*给文件接锁*/
lock_set(fd, F_UNLCK);
getchar();
close(fd);
exit(0);
}
摘自:http://jiangcshuai.blog.163.com/blog/static/184546065201144103424264/
最后
以上就是妩媚八宝粥为你收集整理的fcntl函数锁的功能的全部内容,希望文章能够帮你解决fcntl函数锁的功能所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复