fcntl()】的更多相关文章

dup2的函数定义为: #include <unistd.h> int dup2(int src_fd, int new_fd); 自己实现dup2函数有几个关键点: 1,检查给定的源fd是否有效,且都大于0, 2,检查目标fd是否超出了系统设定的范围,而这个值在书上是没有着重指出的, 比如mac限制了要小于256,ubuntu限制是1024. 3,源fd与目标fd是否相等, 4,利用系统的特性:dup总是返回最小可用的fd,不断重复dup,从而得到一个等于new_fd的fd值 再清除掉new…
此部分测试涉及到APUE V3中,第三章的图3-12到图3-14. 通过fcntl.h提供的功能,修改fd的文件属性,本处增加O_SYNC功能,并测试其效果. 本文涉及代码: tree ch3 ch3 ├── makefile.sync ├── mycat.c ├── set_fl.c ├── set_fl.h ├── sync.c └── test 1 不使用O_SYNC功能 mycat.c 代码: #include "../apue.h" #define BUFFSIZE 4096…
int mydup2(int oldfd, int newfd) {     int tfd = 0;     if (newfd < 0)     {         err_sys("newfd < 0");     }     if (newfd == oldfd)     {         return oldfd;     }       while(1)     {         tfd = dup(oldfd);           if (tfd ==…
很多时候,当我们有多个进程要访问同一个文件的时候,为了防止多进程访问导致的不一致,我们就要考虑进程间的同步问题. fcntl是一个很强大的函数,我们可以通过它给文件的某一部分上锁 int fcntl(int fd, int cmd, ... /*struct flock *flockptr*/); struct flock{ short l_type; off_t l_start; short l_whence; off_t l_en; pid_t l_pid; } fcntl函数的5中功能:…
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 :设置clo…
一.什么是文件锁定 对于锁这个字,大家一定不会陌生,因为我们生活中就存在着大量的锁,它们各个方面发挥着它的作用,现在世界中的锁的功能都可归结为一句话,就是阻止某些人做某些事,例如,门锁就是阻止除了屋主之外的人进入这个房子,你进入不到这个房子,也就不能使用房子里面的东西. 而因为程序经常需要共享数据,而这通常又是通过文件来实现的,试想一个情况,A进程正在对一个文件进行写操作,而另一个程序B需要对同一个文件进行读操作,并以读取到的数据作为自己程序运行时所需要的数据,这会发生什么情况呢?进程B可能会读…
sys/types.h 是Unix/Linux系统的基本系统数据类型的头文件,含有size_t,time_t,pid_t等类型. 在应用程序源文件中包含 <sys/types.h> 以访问 _LP64 和 _ILP32 的定义.此头文件还包含适当时应使用的多个基本派生类型.尤其是以下类型更为重要: clock_t 表示系统时间(以时钟周期为单位). dev_t 用于设备号. off_t 用于文件大小和偏移量. ptrdiff_t 是一种带符号整型,用于对两个指针执行减法运算后所得的结果. si…
int fcntl(int fd,int cmd,...) 函数fcntl提供了非常丰富的功能.主要依赖于cmd的各种参数: 复制已有的文件描述符 F_DUPFD,F_DUPFD_CLOEXEC 获取设置文件描述符的标志 F_GETFD,F_SETFD 获取设置文件状态标志 F_GETFL,F_SETFL 获取设置异步IO的所有权 F_GETOWN,F_SETFL 获取设置记录锁 F_GETLK,F_SETLK,F_SETLKW 当cmd= F_GETFL时,fcntl的功能就是获取fd的文件状…
flock和fcntl都有锁的功能,但他们还有一点小小的区别: 1.flock只能加全局锁,fcntl可以加全局锁也可以加局部锁. 2.当一个进程用flock给一个文件加锁时,用另一个进程再给这个文件加锁,它会阻塞或者也可以返回加锁失败(可以自己设置). 3.当一个进程用fcntl给一个文件加锁时,用另一个进程去读或写文件时必须先获取加锁的信息,然后在给这个文件加锁. 3.当给一个文件加fcntl的独占锁后,再给这个文件加flock的独占锁,其会进入阻塞状态. 4.当给一个文件加flock的独占…
功能描述:根据文件描述词来操作文件的特性. 文件控制函数         fcntl -- file control 头文件: #include <fcntl.h>;          int fcntl(int fd, int cmd);          int fcntl(int fd, int cmd, long arg);          int fcntl(int fd, int cmd, struct flock *lock); [描述]            Fcntl()针…
fcntl()函数可以改变已打开文件的性质 <pre lang="c" escaped="true"> #include <unistd.h> #include <fcntl.h> int fcntl(int fd , int cmd); int fcntl(int fd, int cmd, long arg); int fcntl(int fd, int cmd, struct flock * lock); </pre&g…
fcntl函数可以改变已打开的文件的性质. #include <fcntl.h> int fcntl( int filedes, int cmd, ... /* int arg */ ); 返回值:若成功则依赖于cmd,若出错则返回- 在本节的各实例中,第三个参数总是一个整数,与上面所示函数原型中的注释部分相对应.但是在说明记录锁时,第三个参数则是指向一个结构的指针. fcntl函数有5种功能: (1)复制一个现有的描述符(cmd = F_DUPFD ). (2)获得/设置文件描述符标记(cm…
fcntl 函数是一个相当常用的对文件进行加锁操作的函数. 文件锁包括强制锁.建议锁.记录锁, 不过一般系统和内核都是用的强制锁. 以下为记录锁的例子:----------------------------------------------- 记录锁分为读锁.写锁.. 读锁是共享锁,可以有多把,多个进程可以同时对一个文件读. 写锁是互斥锁,同一时间只能有一个进程写文件. fcntl的函数原型:int  fcntl(int fd, int cmd, struct flock *lock); 参…
写这篇文正主要是为了介绍下fcntl,并将我自己在学习过程中的一些理解写下来,不一定那么官方,也有错误,希望指正,共同进步- fcntl: 一个修改一打开文件的性质的函数.基本的格式是 int fcntl(int filedes, int cmd, ...) 包含在头文件<fcntl.h>中. 参数三是看cmd这个参数的设置.函数返回一个文件描述符.fcntl有五种功能.下面介绍其中的三种功能 1.复制一个现有的描述符(cmd = F_DUPFD) 2.获得/设置文件描述符标记(cmd = F…
期末考试快要来了,Linux学习进度一下拉下来许多.今天学习的是文件锁定,在Linux中,实现文件锁定的方法很多,例如fcntl和lockf.下面主要是fcntl的调用. fcntl函数的原型是:int fcntl( int fd, //文件标识符    int command, //这个具体选项看学习笔记11,最后有具体介绍,这里主要用到的是F_GETLK.F_SETLK或F_SETLKW struct flock* flock_structure  //文件锁结构体 ); 上面出现的第二个参…
tee函数使用 功能描述:tee函数在两个管道文件描述符之间复制数据,也是零拷贝操作.它不消耗数据,因此源文件描述符仍然可以用于后续的操作. 函数原型: #include <fcntl.h> ssize_t tee(int fd_in,int fd_out,size_t len,unsigned int flags); 函数参数:fd_in和fd_out必须都是管道文件描述符. 返回值:成功时返回在两个文件描述符之间复制的数据字节数,返回0表示没有复制任何数据.失败时返回-1并设置errno.…
对文件加锁是原子性的,可以用于进程间文件操作的同步.在linux下,有三个函数可以对文件进程加锁,分别是fcntl.flock.lockf.这里只说fcntl,它的用法也是最复杂的. fcntl是file control的缩写.在linux下大部分设备都是文件,所以fcntl的功能也比较多,包括: Duplicating a file descriptor(复制文件描述符) File descriptor flags(操作close-on-exec标志) File status flags(操作…
一.fcntl 用以下方法将socket设置成为非阻塞方式 int  flags = fcntl(socket,F_GETFL,0); fcntl(socket,F_SETFL,flags|O_NONBLOCK); 将非阻塞的设置回阻塞可以用 int  flags = fcntl(socket,F_GETFL,0); fcntl(socket,F_SETFL,flags&~O_NONBLOCK); -------------------------------------------------…
1.获取文件的flags,即open函数的第二个参数: flags = fcntl(fd,F_GETFL,0); 2.设置文件的flags: fcntl(fd,F_SETFL,flags); 3.增加文件的某个flags,比如文件是阻塞的,想设置成非阻塞: flags = fcntl(fd,F_GETFL,0); flags |= O_NONBLOCK; fcntl(fd,F_SETFL,flags); 4.取消文件的某个flags,比如文件是非阻塞的,想设置成为阻塞: flags = fcnt…
linux文件I/O用:open.read.write.lseek以及close函数实现了文件的打开.读写等基本操作.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:同上. 有以下操…
功能描述:根据文件描述词来操作文件的特性. 文件控制函数         fcntl -- file control LIBRARY         Standard C Library (libc, -lc) SYNOPSIS         #include <fcntl.h>;          int fcntl(int fd, int cmd);          int fcntl(int fd, int cmd, long arg);          int fcntl(int…
#include<fcntl.h> int fcntl(fd,F_GETLK/F_SETLK/F_SETLKW,struct flock *flockptr); F_GETLK:测试flockptr描述的锁,是否和现有锁冲突.冲突:现有锁写入flockptr中:不冲突:flockptr不变. F_SETLK:试图获得读锁.写锁.解锁,冲突,立即出错返回,errno为EACCES/EAGAIN F_SETLKW:F_SETLK阻塞版,不冲突,同F_SETLK;冲突,休眠,直到可以创建锁,或者信号…
  fcntl() F_GETFL---------------------------------------------        将文件状态标志作为函数值返回. 文件状态标志:        O_RDONLY        O_WRONLY        O_RDWR        O_APPEND        O_NONBLOCK      O_SYNC FASYNC(O_ASYNC)        三个存取方式标志(O_RDONLY, O_WRONLY, O_RDWR)是互斥的,…
记录锁相当于线程同步中读写锁的一种扩展类型,可以用来对有亲缘或无亲缘关系的进程进行文件读与写的同步,通过fcntl函数来执行上锁操作.尽管读写锁也可以通过在共享内存区来进行进程的同步,但是fcntl记录上锁往往更容易使用,且效率更高. 记录锁的功能:当一个进程正在读或修改文件的某个部分是,它可以阻止其他进程修改同一文件区.对于这个功能阐述我认为有三点要解释的: 记录锁不仅仅可以用来同步不同进程对同一文件的操作,还可以通过对同一文件加记录锁,来同步不同进程对某一共享资源的访问,如共享内存,I/O设…
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #define ERR_EXIT(m) \ do { \ perror(m);\ exit(EXIT_FAILURE);\ }while(0…
参考  linux中fcntl().lockf.flock的区别 这三个函数的作用都是给文件加锁,那它们有什么区别呢? 首先flock和fcntl是系统调用,而lockf是库函数.lockf实际上是fcntl的封装,所以lockf和fcntl的底层实现是一样的,对文件加锁的效果也是一样的.后面分析不同点时大多数情况是将fcntl和lockf放在一起的. 下面首先看每个函数的使用,从使用的方式和效果来看各个函数的区别. 1. flock l 函数原型 #include<sys/file.h> i…
fcntl函数提供了与网络编程相关的如下特性: 非阻塞式I/O.  通过使用F_SETFL命令设置O_NONBLOCK文件状态标志,我们可以把一个套接字设置为非阻塞型. 信号驱动式I/O. 通过使用F_SETFL命令设置O_ASYNC文件状态标志,我们可以把一个套接字设置成O_ASYNC,一旦其状态发生变化,内核就产生一个SIGIO信号. F_SETOWN命令允许我们指定用于接收SIGIO和SIGURG信号的套接字属主(进程ID或进程组ID).其中SIGIO信号是套接字被设置为信号驱动式I/O型…
一.记录锁 record locking 功能:当一个进程正在读或修改文件的某个部分时,它可以阻止其它进程修改同一文件区. 字节范围锁 byte-range locking 二.历史 flock函数,可以锁整个文件,不能锁文件中的一部分. fcntl函数,增加了记录锁的功能. lockf函数,在fcntl基础上构造了lockf函数,提供一个简化的接口.可以锁文件中任意字节数的区域 三.fcntl 记录锁 函数原型: int fcntl(int fd, int cmd, struct flock…
文件共享 一个进程打开了两个文件 文件表条目(file-table-entry): 1.文件状态标志(file-status-flags): 读/写/追加/同步/非阻塞等; 2.当前文件偏移量 3.v节点指针 //验证 int main(int argc, char *argv[]) { int fd1 = open("test.txt", O_RDONLY); if (fd1 == -1) err_exit("fd1 open O_RDONLY error");…
59.1 介绍 前面介绍的函数如,recv.send.read 和 write 等函数都是阻塞性函数,若资源没有准备好,则调用该函数的进程将进入阻塞状态.我们可以使用 I/O 多路复用来解决此问题(即解决并发). I/O 多路复用的方式主要有两种实现方法 fcntl 函数实现(非阻塞方式) select 函数实现 59.1.1 fcntl 非阻塞方式——I/O多路复用/转换 59.2 例子 59.2.1 动态数组模块 vector_fd.c #include <malloc.h> #inclu…