Fcntl函数语法要点
所需头文件:#include
          #include
          #include
函数原型:int fcntl(int fd,cmd,struct flock *lock)
函数传入值:
fd:文件描述符
Cmd:F_DUPFD:复制文件描述符
    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:设置进程号或进程组号
Lock:结构为flock,设置记录锁的具体状态
函数返回值:成功:0       -1:出错
Lock的结构如下所示:
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:读取锁(共享锁)
        F_WRLCK:写入锁(排斥锁)
        F_UNLCK:解锁
L_stat:相对位移量(字节)
L_whence:相对位移量的起点(同lseek的whence)
    SEEK_SET:当前位置为文件开头,新位置为偏移量的大小
    SEEK_CUR:当前位置为文件指针位置,新位置为当前位置加上偏移量
    SEEK_END:当前位置为文件的结尾,新位置为文件的大小加上偏移量大小
L_len:加锁区域长度
使用实例

/**/
#include <stdio.h>
#include <unstd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h> void lock_set(int fd,int type)
{
struct flock lock;
lock.l_whence = SEEK_SET;//赋值lock结构体
lock.l_start = ;
lock.l_len = ;
while() {
lock.l_type = type;
/*根据不同的type值给文件上锁或解锁*/
if ((fcntl(fd, F_SETLK, &lock)) == ) {
if (lock.l_type == F_RDLCK)
printf("read lock set by %d\n", getpid());
else if (lock.l_type == F_WRLCK)
printf("write lock set by %d\n", getpid());
else if (lock.l_type == F_UNLCK)
printf("release lock set by %d\n",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 %d\n",lock.l_pid);
/*该文件已有读取锁*/
else if (lock.l_type == F_WRLCK)
printf("write already lock set by %d\n", lock.l_pid);
getchar();
}
}
} int main(void)
{
int fd;
fd = open("hello", O_RDWR|O_CREAT, );
if (fd < ) {
perror("open");
exit();
}
lock_set(fd,F_WRLCK);
getchar();
lock_set(fd,F_UNLCK);
getchar();
close(fd);
exit();
}

文件I/O编程 (fcntl)的更多相关文章

  1. Linux系统编程(3)——文件与IO之fcntl函数

    linux文件I/O用:open.read.write.lseek以及close函数实现了文件的打开.读写等基本操作.fcntl函数可以根据文件描述词来操作文件. 用法: int fcntl(int ...

  2. UNIX环境编程学习笔记(5)——文件I/O之fcntl函数访问已打开文件的性质

    lienhua342014-08-29 fcntl 函数可以改变已打开的文件的性质. #include <fcntl.h> int fcntl(int filedes, int cmd, ...

  3. linux编程fcntl获取和设置文件状态

    #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> ...

  4. 文件I/O之fcntl函数

    fcntl函数可以改变已打开的文件的性质. #include <fcntl.h> int fcntl( int filedes, int cmd, ... /* int arg */ ); ...

  5. UNIX网络编程——fcntl函数

    fcntl函数提供了与网络编程相关的如下特性: 非阻塞式I/O.  通过使用F_SETFL命令设置O_NONBLOCK文件状态标志,我们可以把一个套接字设置为非阻塞型. 信号驱动式I/O. 通过使用F ...

  6. Linux系统编程:文件I/O编程

    文件I/O操作在Linux编程时是经常会使用到的一个内容,通常可以把比较大的数据写到一个文件中来进行存储或者与其他进程进行数据传输,这样比写到一个全局数组或指针参数来实现还要方便好多. 一.文件常用操 ...

  7. 【转】资源文件在Delphi编程中的应用

    段东宁 计亚南 (郴州职业技术学院, 湖南 郴州  423000) 摘要: 资源文件是一种能有效地组织.管理和使用资源的文件形式,在软件开发中有着广泛的应用.本文详细介绍了在Delphi编程中资源文件 ...

  8. HDFS文件系统基本文件命令、编程读写HDFS

    基本文件命令: 格式为:hadoop fs -cmd <args> cmd的命名通常与unix对应的命令名相同.例如,文件列表命令: hadoop fs -ls 1.添加目录和文件 HDF ...

  9. Linux系统编程——fcntl

    fcntl可实现对指定文件描述符的各种操作,其函数原型如下: int fcntl(int fd, int cmd, ... /* arg */ ); 头文件 #include <unistd.h ...

随机推荐

  1. Java内存泄漏分析和预防

    1. 什么是内存泄漏?有什么危害 书面说法: 内存泄漏:对象已经没有被应用程序使用,但是垃圾回收器没办法移除它们,因为还在被引用着. 在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个 ...

  2. LDA(Latent Dirichlet Allocation)主题模型算法

    原文 LDA整体流程 先定义一些字母的含义: 文档集合D,topic集合T D中每个文档d看作一个单词序列< w1,w2,...,wn >,wi表示第i个单词,设d有n个单词.(LDA里面 ...

  3. Java代码审计-铁人下载系统

    初学 java 代码审计,跟着表哥们脚步,走一遍审计流程,就选了个没有使用 Java 框架的 java 系统,作为入门. 目的是为了熟悉代码审计流程,寻找漏洞的思路,入门记录. 准备工作 为了验证审计 ...

  4. Kotlin之定义函数

    java: int add (int m ,int n){ return m+n; } void process(int m){ Systrm.out.println(m); } kotlin: fu ...

  5. mysql的性能优化简介

    mysql性能下降的原因 sql语句本身有问题,或没建索引 索引失效,索引失效的原因本文后面会叙述 关联了过多的表,可能是前期设计缺陷,或者太奇葩的需求 服务器调优及参数设置,例如缓冲.线程等 mys ...

  6. [Cinder] 存储 Qos

    目录 文章目录 目录 前言 操作步骤 参考文章 前言 Cinder 支持 front-end 和 back-end 两种类型的存储 QoS,前者由 Hypervisor 端实现(e.g. 通过 Lib ...

  7. ALV SCRIPTFROM 内容比较全的一个例子

    REPORT  ZQM_PRT04. *----------------------------------------------------------------------* * TABLES ...

  8. beego 注解路由

    场景描述:使用注解路由,不起作用. 额外描述: 路由的添加都写在 main函数中了,同时未设置 beego.BConfig.RunMode ="dev"也未引入 :routers包 ...

  9. 【HANA系列】SAP ECLIPSE中创建ABAP项目的步骤

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP ECLIPSE中创建AB ...

  10. 11.8 Springcloud项目简介

    各位领导好,我从毕业后做了两年Java开发工程师,刚开始都是一些SSM框架的项目,但是由于技术不断更新,微服项目成为必然的趋势,大约在做了1年的SSM框架,之后开始接触微服项目,前后经理过Dubbo和 ...