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. Vue路由器的简单实现

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  2. [C#菜鸟]C# Hook (三) Windows常用消息大全

    表A-1  Windows消息分布 消息范围 说 明 0 - WM_USER – 1 系统消息 WM_USER - 0x7FFF 自定义窗口类整数消息 WM_APP - 0xBFFF 应用程序自定义消 ...

  3. C# NAudio 变声

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  4. leetcode 509斐波那契数列

    递归方法: 时间O(2^n),空间O(logn) class Solution { public: int fib(int N) { ?N:fib(N-)+fib(N-); } }; 递归+记忆化搜索 ...

  5. PE盘制作

    我这里以大白菜为例来讲解这个一条龙的服务: 1.去大白菜官网下载一U盘制作工具: 2.准备一个4G以上的U盘(我这里建议16G比较好,这样制作完成之后,我们还可以拷贝几个常用的镜像进去,方便今后使用) ...

  6. 第一章 SpringCloud简介

    1.架构演进与微服务 单体架构:一个归档包包含所有的功能的应用程序. 缺点: 复杂性逐渐变高 技术债务逐渐上升 部署速度逐渐变慢 阻碍技术创新 无法按需伸缩 架构演进: 单体架构 SOA 微服务 微服 ...

  7. 文件分发服务器 AWS CloudFront(CDN)使用入门-以S3为例 Lebal:Research

    引言 在互联网上随意右击一张图片,都可以发现复制图片地址这个选项,这说明他们都有自己的链接(直链),也就是说我们可以通过一个链接本身来访问图片.代码等文件,而不是打开一个网页再选择复制,这就和下载链接 ...

  8. java:IO流(File,字节流/输入输出流(InputStream(FileInputStream),OutputStream(FileOutStream)),字符流(Reader,Writer))

    File: * java.io.File类:代表一个文件或目录. * 常用的构造方法: * File(String pathname)通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例 ...

  9. Day01:对象和类(上)

    对象的概念 Java 是面向对象的编程语言,对象就是面向对象程序设计的核心.所谓对象就是真实世界中的实体,对象与实体是一一对应的,也就是说现实世界中每一个实体都是一个对象,它是一种具体的概念.对象有以 ...

  10. vue,基于element的tree组件封装

    封装组件代码 // 组件:树 /* 参数说明-属性: 1.treeData:展示数据(array) 2.treeEmptyText:内容为空的时候展示的文本(String) 3.treeNodeKey ...