fcntl系统调用

功能描述:根据文件描述词来操作文件的特性。

用法:

int fcntl(int fd, int cmd); 
int fcntl(int fd, int cmd, long arg); 
int fcntl(int fd, int cmd, struct flock *lock); 

参数:

  • fd:文件描述词。
  • cmd:操作命令。
  • arg:供命令使用的参数。
  • lock:同上。

有以下操作命令可供使用

一、F_DUPFD:复制文件描述词。

二、FD_CLOEXEC :设置close-on-exec标志。

如果FD_CLOEXEC位是0,执行execve的过程中,文件保持打开。反之则关闭。

三、F_GETFD:读取文件描述词标志。 

四、F_SETFD:设置文件描述词标志。 

五、F_GETFL:读取文件状态标志。 

六、F_SETFL:设置文件状态标志。

其中O_RDONLY, O_WRONLY, O_RDWR, O_CREAT,  O_EXCL, O_NOCTTY 和 O_TRUNC不受影响,能更改的标志有 O_APPEND,O_ASYNC, O_DIRECT, O_NOATIME 和 O_NONBLOCK。

七、F_GETLK, F_SETLK 和 F_SETLKW :获取,释放或测试记录锁,使用到的参数是以下结构体指针:

  • F_SETLK:在指定的字节范围获取锁(F_RDLCK, F_WRLCK)或释放锁(F_UNLCK)。如果和另一个进程的锁操作发生冲突,返回 -1并将errno设置为EACCES或EAGAIN。
  • F_SETLKW:行为如同F_SETLK,除了不能获取锁时会睡眠等待外。如果在等待的过程中接收到信号,会即时返回并将errno置为EINTR。
  • F_GETLK:获取文件锁信息。
  • F_UNLCK:释放文件锁。

为了设置读锁,文件必须以读的方式打开。为了设置写锁,文件必须以写的方式打开。为了设置读写锁,文件必须以读写的方式打开。

八、信号管理 

F_GETOWN, F_SETOWN, F_GETSIG 和 F_SETSIG 被用于IO可获取的信号。

  • F_GETOWN:获取当前在文件描述词 fd上接收到SIGIO 或 SIGURG事件信号的进程或进程组标识 。
  • F_SETOWN:设置将要在文件描述词fd上接收SIGIO 或 SIGURG事件信号的进程或进程组标识 。
  • F_GETSIG:获取标识输入输出可进行的信号。
  • F_SETSIG:设置标识输入输出可进行的信号。

使用以上命令,大部分时间程式无须使用select()或poll()即可实现完整的异步I/O。

九、租约( Leases) 

1、F_SETLEASE 和 F_GETLEASE 被用于当前进程在文件上的租约。文件租约提供当一个进程试图打开或折断文件内容时,拥有文件租约的进程将会被通告的机制。

2、F_SETLEASE:根据以下符号值设置或删除文件租约

  • F_RDLCK设置读租约,当文件由另一个进程以写的方式打开或折断内容时,拥有租约的当前进程会被通告。
  • F_WRLCK设置写租约,当文件由另一个进程以读或以写的方式打开或折断内容时,拥有租约的当前进程会被通告。
  • F_UNLCK删除文件租约。

3、F_GETLEASE:获取租约类型。

十、文件或目录改动通告 

(linux 2.4以上)当fd索引的目录或目录中所包含的某一文件发生变化时,将会向进程发出通告。arg参数指定的通告事件有以下,两个或多个值能通过或运算组合。

  • DN_ACCESS 文件被访问 (read, pread, readv)
  • DN_MODIFY 文件被修改(write, pwrite,writev, truncate, ftruncate)
  • DN_CREATE 文件被建立(open, creat, mknod, mkdir, link, symlink, rename)
  • DN_DELETE 文件被删除(unlink, rmdir)
  • DN_RENAME 文件被重命名(rename)
  • DN_ATTRIB 文件属性被改动(chown, chmod, utime[s])

返回说明:

成功执行时,对于不同的操作,有不同的返回值

  • F_DUPFD:新文件描述词
  • F_GETFD:标志值
  • F_GETFL:标志值
  • F_GETOWN:文件描述词属主
  • F_GETSIG:读写变得可行时将要发送的通告信号,或0对于传统的SIGIO行为

对于其他命令返回0。

失败返回-1,errno被设为以下的某个值

  • EACCES/EAGAIN: 操作不被允许,尚未可行
  • EBADF: 文件描述词无效
  • EDEADLK: 探测到可能会发生死锁
  • EFAULT: 锁操作发生在可访问的地å址空间外
  • EINTR: 操作被信号中断
  • EINVAL: 参数无效
  • EMFILE: 进程已超出文件的最大可使用范围
  • ENOLCK: 锁已被用尽
  • EPERM:权能不允许
struct flock {
short l_type; /* 锁类型: F_RDLCK, F_WRLCK, F_UNLCK */
short l_whence; /* l_start字段参照点: SEEK_SET(文件头), SEEK_CUR(文件当前位置), SEEK_END(文件尾) */
off_t l_start; /* 相对于l_whence字段的偏移量 */
  off_t l_len; /* 需要锁定的长度 */
pid_t l_pid; /* 当前获得文件锁的进程标识(F_GETLK) */
};

Linux C fcntl()函数详解的更多相关文章

  1. [转]Linux系统调用--fcntl函数详解

    功能描述:根据文件描述词来操作文件的特性. 文件控制函数          fcntl -- file control头文件: #include <unistd.h> #include & ...

  2. Linux环境fork()函数详解

    Linux环境fork()函数详解 引言 先来看一段代码吧, 1 #include <sys/types.h> 2 #include <unistd.h> 3 #include ...

  3. linux的system () 函数详解

    linux的system () 函数详解     system(执行shell 命令)相关函数        fork,execve,waitpid,popen表头文件        #i nclud ...

  4. 【转】linux 中fork()函数详解

    在看多线程的时候看到了这个函数,于是学习了下,下面文章写的通俗易懂,于是就开心的看完了,最后还是很愉快的算出了他最后一个问题. linux 中fork()函数详解 一.fork入门知识 一个进程,包括 ...

  5. Linux系统调用--getrusage函数详解

    Linux系统调用--getrusage函数详解 功能描述:     获得进程的相关资源信息.如:用户开销时间,系统开销时间,接收的信号量等等;   用法:    #include <sys/t ...

  6. Linux C popen()函数详解

    表头文件 #include<stdio.h> 定义函数 FILE * popen( const char * command,const char * type); 函数说明 popen( ...

  7. Linux中fork()函数详解(转载)

    linux中fork()函数详解 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事, ...

  8. Linux fcntl函数详解

    功能描述:根据文件描述词来操作文件的特性. 文件控制函数          fcntl -- file control 头文件: #include <unistd.h> #include ...

  9. Linux 系统 文件锁 fcntl函数详解

    #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd); int fcntl(int fd, int ...

随机推荐

  1. Excellent Articles

    Lisp The roots of lisp Recursive Functions of Symbolic Expressions and Their Computation by Machine, ...

  2. NYOJ 461

    Fibonacci数列(四) 描述  数学神童小明终于把0到100000000的Fibonacci数列(f[0]=0,f[1]=1;f[i] = f[i-1]+f[i-2](i>=2))的值全部 ...

  3. 通过端口 8080 连接到主机 localhost 的 TCP/IP 连接失败

    错误:“connect timed out.请验证连接属性,并检查 SQL Server 的实例正在主机上运行,且在此端口接受 TCP/IP 连接,还要确保防火墙没有阻止到此端口的 TCP 连接.”这 ...

  4. Child <- many-to-one ->Parent

    网上找到个描述的很精妙的例子 Child   <-   many-to-one   ->Parent         class   Child   {         private   ...

  5. 【C#】【Thread】SpinWait

    System.Threading.SpinWait 是一个轻量同步类型,可以在低级别方案中使用它来避免内核事件所需的高开销的上下文切换和内核转换. 在多核计算机上,当预计资源不会保留很长一段时间时,如 ...

  6. 用纯css改变下拉列表select框的默认样式(不兼容IE10以下)

    在这篇文章里,我将介绍如何不依赖JavaScript用纯css来改变下拉列表框的样式.     事情是这样的,您的设计师团队向您发送一个新的PSD(Photoshop文档),它是一个新的网站的最终设计 ...

  7. Android 自定义Dialog类,并在Activity中实现按钮监听。

      实际开发中,经常会用到Dialog,比如退出时候会弹出是否退出,或者还有一些编辑框也会用Dialog实现,效果图如下: 开发中遇到的问题无非在于如果在Activity中监听这个Dialog中实现的 ...

  8. 【swift学习笔记】三.使用xib自定义UITableViewCell

    使用xib自定义tableviewCell看一下效果图 1.自定义列 新建一个xib文件 carTblCell,拖放一个UITableViewCell,再拖放一个图片和一个文本框到tableviewc ...

  9. SQLite剖析之异步IO模式、共享缓存模式和解锁通知

    1.异步I/O模式    通常,当SQLite写一个数据库文件时,会等待,直到写操作完成,然后控制返回到调用程序.相比于CPU操作,写文件系统是非常耗时的,这是一个性能瓶颈.异步I/O后端是SQLit ...

  10. java学习流程

    J2SE 面向对象-封装.继承.多态内存的分析递归集合类.泛型.自动打包与解包.Annotation IO 多线程.线程同步 TCP/UDP AWT.事件模型.匿名类 正则表达式反射机制 2:数据库( ...