第二个参数cmd的五种取值方式: 复制一个现存的描述符(cmd=F_DUPFD) 获得/设置文件描述符标记(cmd=F_GETFD或F_SETFD) 获得/设置文件状态标志(cmd=F_GETFL或F_SETFL) 获得/设置异步I/O信号接收进程(cmd=F_GETOWN或F_SETOWN) 获得/设置记录锁(cmd=F_GETLK,F_SETLK或F_SETLKW) F_DUPFD 复制文件描述符filedes,与dup类似 fcntl返回新文件描述符 新描述符是尚未打开的各描述符中,大于或等于第三个参数值中,各值的最小值 例子:假设文件描述符0、1、2被占用, fcntl(1, F_DUPFD, 5)返回什么??? fcntl(2, F_DUPFD, 1)返回什么??? fcntl函数与dup、dup2函数均用于复制文件描述符,即使不同的文件描述符指向同一个文件对象 dup(filedes)等价于 fcntl(filedes, F_DUPFD, 0); dup2(filedes, filedes2)不完全等价于 close(filedes2); fcntl(filedes, F_DUPFD, filedes2); fcntl与dup2不完全等价 dup2是一个原子操作,而close与fcntl则包括两个函数调用。 在close和fcntl之间可能被信号打断 dup2与fcntl之间有某些不同的errno F_GETFD 将文件描述符filedes对应的标志,作为返回值返回。 当前只定义了一个文件描述符标志FD_CLOEXEC F_SETFD 设置文件描述符filedes对应的标志。新标志按照第三个参数设置。 将此标志设为0(系统默认,在exec时不关闭)或1(在exec时关闭) F_GETFL fcntl函数返回文件描述符filedes对应的文件状态标志 文件状态标志包括: O_RDONLY O_WRONLY O_RDWR O_APPEND O_NONBLOCK 非阻塞方式 O_SYNC 等待写完成,设置该标志将造成每次write都要等待,直到数据已写到磁盘上再返回。 O_ASYNC 异步I/O(仅4.3+BSD) F_SETFL 将fcntl函数的第三个参数,设置为文件状态标志 可以更改的标志包括:O_APPEND、O_NONBLOCK、O_SYNC、O_ASYNC 实例:获取文件状态标志 代码演示 int fd = open(.......); int val = fcntl(fd, F_GETFL); int accmode = val O_ACCMODE; O_ACCMODE=3 0......0011 O_RDONLY=0 O_WRONLY=1 O_RDWR=2 对应的是最低的两位bit 取val最低的两位 即获取了文件打开模式 对于非打开模式标志: if(val O_APPEND) {//文件状态标志中包括O_APPEND } O_APPEND=1024 第11个bit为1,其余为0. 即第11位对应了O_APPEND标志 取val第11位查看是否为1 添加或删除某个文件描述符标志或文件状态标志时, 先将现有标志值存放在某个变量中,再对该变量进行修改,最后将该变量设置为新的标志。 不能只是执行F_SETFD或F_SETFL命令,这样会关闭以前设置的标志位。 ioctl函数是I/O操作的杂物箱 其实现的功能往往和具体的设备有关系 设备可以自定义自己的ioctl命令 操作系统提供了通用的ioctl命令 函数原型 int ioctl ( int fd, /* file descriptor */ int function, /* function code */ int arg /* arbitrary argument */ ) 例:ioctl (fd, FIORENAME, newname); * 注意解释一下只写打开的文件描述符。举了例子,说明当需要创建一个文件,然后向其中写内容,然后再读,不能完成这个功能。 * 当文件存在时,调用creat函数,会将文件的大小变为0 * 下一次的读写就从这次读写数据的尾部进行 通常情况下文件偏移量都是文件开头,指定O_APPEND后,偏移量到文件尾部 * lseek修改的是哪个结构体,哪个字段呢 修改的是已打开文件对象的f-pos字段, 这个字段保存了当前文件偏移量 说明并不对磁盘进行访问 * 举一个例子说明,比如文件大小为100,定位到150,然后从
原创力文档

文档评论(0)