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. Dubbo Monitor Simple 监控中心

    下载项目源码(其中的 dubbo-registry-simple 代表简单的注册中心,用于开发测试,生产环境一般用zookeeper) https://github.com/apache/incuba ...

  2. P2010 回文日期

    P2010 回文日期 题解 回文日期,一共8位,只需要枚举4位就好了其实,然后判断它是否合法 代码 #include<bits/stdc++.h> using namespace std; ...

  3. golang defer那些坑

    defer以下几个特性,使用时需要关注下. 即时的参数传递 调用os.Exit()时defer不会被执行 defer与return的先后顺序 1.即时的参数传递 定义defer时传入的参数,是作为拷贝 ...

  4. golang网络通信超时设置

    网络通信中,为了防止长时间无响应的情况,经常会用到网络连接超时.读写超时的设置. 本文结合例子简介golang的连接超时和读写超时设置. 1.超时设置 1.1 连接超时 func DialTimeou ...

  5. leetcode 200岛屿的个数

    主要考察图搜索: 方法一:染色法,时间O(mn) 遍历一遍,再通过BFS或DFS将所有临近岛屿染色,使用dfs时将numIslands中的bfs换成dfs即可: /***** 遍历所有的点: 只要遇见 ...

  6. Java学习之==>常用字符串方法

    1.定义字符串 // 定义, 为初始化 String str1; // 定义, 并初始化为null String str2 = null; // 定义, 并初始化为空串 String str3 = & ...

  7. RTX数据表分析

    /******************************************* * UserName 做主键 **************************************** ...

  8. Jenkins Pipeline 语法

    Pipeline语法 先讲Declarative Pipeline,所有声明式管道都必须包含在pipeline块中: 123 pipeline { /* insert Declarative Pipe ...

  9. vue按需引入Element UI的方法

    在我们的实际项目开发中,多数是采用按需引入的模式来进行开发的,那么具体应该如何操作呢,可能会有许多新人傻傻分不清楚,具体将在下文讲到. 首先我们先vue create demo创建一个项目出来此时我们 ...

  10. Pytorch笔记 (1) 初始神经网络

    一.人工神经元 上方人工神经元中: 输入 * 权重 ——>  相当于 人神经元中  树突的功能 各输入 相加 ,再做非线性变化f ——>  相当于胞体的功能 将非线性变化的结果输出 ——& ...