I/O -x fcntl()

fcntl函数:int fcntl(int filedes, int cmd, .../*int arg */);
  返回:若成功则依赖于cmd,若出错为-1。
  作用:可以改变已打开的文件的性质
下列三个命令有特定的返回值:F_DUPFD,F_GETFD以及F_GETOWN。
  第一个返回新的文件描述符,第二个返回相应标志,最后一个返回一个正的进程ID或负的进程组ID。

  第三个参数总是一个整数,当然在作为记录锁用时,第三个参数则是指向一个结构的指针。
fcntl函数有五种功能:
(1)复制一个现存的描述符(cmd=F_DUPFD)
(2)获得/设置文件描述符标志(cmd=F_GETFD或F_SETFD)
(3)获得/设置文件状态标志(cmd=F_GETFL或F_SETFL)
(4)获得/设置异步I/O有权(cmd=F_GETOWN或F_SETOWN)
(5)获得/设置记录锁(cmd=F_GETLK,F_SETLK或F_SETLKW)

F_DUPFD:复制文件描述符filedes,新文件描述符作为函数值返回。它是尚未打开的各描述符中大于或等于第三个参数值中各值的最小值。新描述符与filedes共享同一文件表项。但是新描述符有它自己的一套文件描述符标志,其FD_CLOEXEC文件描述符标志被清除。
F_GETFD:对应于filedes的文件描述符标志作为函数值返回。当前只定义了一个文件描述符标志FD_CLOEXEC。
F_SETFD:对于filedes设置文件描述符标志。新标志值按第三个参数设置。
F_GETFL:对应于filedes的文件状态标志作为函数返回。在说明open函数时,已说明了文件状态标志。
F_SETFL:将文件状态标志设置为第三个参数的值(取整数值),可以更改的几个标志:O_APPEND,O_NONBLOCK,O_SYNC和O_ASYNC。
F_GETOWN:取当前接受SIGIO和SIGURG信号的进程ID或进程组ID。
F_SETOWN:设置接受SIGIO和SIGURG信号的进程ID或进程组ID。正的arg指定一个进程ID,负的arg表示等于arg绝对值的一个进程组ID。
范例:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <unistd.h>
 4 #include <fcntl.h>
 5 int main(int argc, char **argv)
 6 {
 7      int fd;
 8      int var;
 9      if(argc!=2)
10      {
11          printf("please input filename and one arg!\n");
12          exit(1);
13      }
14      if((var=fcntl(atoi(argv[1]),F_GETFL,0))==-1)
15      {
16          printf("fcntl file error!\n");
17          exit(1);
18      }
19      printf("%d\n",var);
20      switch(var & O_ACCMODE)
21      {
22          case O_RDONLY:printf("Read only.\n");
23                       break;
24          case O_WRONLY:printf("Write only.\n");
25                       break;
26          case O_RDWR: printf("Read Write.\n");
27                       break;
28          default:break;
29      }
30      exit(0);
31 }
时间: 2024-10-03 18:31:04

I/O -x fcntl()的相关文章

不调用fcntl,自己实现dup2函数功能

#include<stdlib.h> #include<stdio.h> #include<unistd.h> #include<fcntl.h> int my_dup(int fd,int fd2) {     if(fd==fd2)             return fd2;     int n= 0;     int look= 0;     int i_count= -1;     int * fd_arr=NULL;     fd_arr=(i

第七篇:使用 fcntl 函数 获取,设置文件的状态标志

前言 当打开一个文件的时候,我们需要指定打开文件的模式( 只读,只写等 ).那么在程序中如何获取,修改这个文件的状态标志呢?本文将告诉你如何用 fcntl函数 获取指定文件的状态标志. 解决思路 1. 对于获取文件状态标志,我们可以通过调用fcntl函数得到一个记录文件标志的整型变量,然后分别让它和各个状态标志常量进行&操作.若操作结果为正则文件具有此状态标志,否则文件没有此状态标志.( 如果是检查只读,只写,可读可写,则需要和ACCMODE相&,然后判断其结果是否为O_RDONLY,O_

fcntl函数介绍

1.fcntl:manipulate file descriptor 1)简介:fcntl(file control)函数可执行各种描述符控制操作. #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd, ... /* arg */ ); 2)正确的使用方法(以设置“非阻塞”标记为例): int flags; // 先获取当前的flags if ((flags = fcntl(sockfd, F_GETFL

fcntl函数加文件锁

对文件加锁是原子性的,可以用于进程间文件操作的同步.在linux下,有三个函数可以对文件进程加锁,分别是fcntl.flock.lockf.这里只说fcntl,它的用法也是最复杂的. fcntl是file control的缩写.在linux下大部分设备都是文件,所以fcntl的功能也比较多,包括: Duplicating a file descriptor(复制文件描述符) File descriptor flags(操作close-on-exec标志) File status flags(操作

fcntl设置无阻塞的超时连接

场景描述:采用fcntl函数设置无阻塞套接字,尝试连接远程服务器,连接的时候出现如下的错误: if(fcntl(sock, F_SETFL, O_NONBLOCK) == -1)   return -1; printf("Connect return retval = %d,sock =%d\n",retval,sock);    retval = connect(sock, (struct sockaddr *)&edpinfo->servAddr, sizeof(st

第3章 文件I/O(4)_dup、dup2、fcntl和ioctl函数

5. 其它I/O系统调用 (1)dup和dup2函数 头文件 #include<unistd.h> 函数 int dup(int oldfd); int dup2(int oldfd, int newfd); 返回值 若成功返回新文件描述符,出错返回-1 功能 文件描述符的复制(将oldfd复制给newfd) 参数 old:原先的文件描述符 newfd: 新文件描述符 备注 (1)由dup返回的新文件描述符一定是当前可用文件描述符中最小数值. (2)用dup2则可以用newfd参数指定新描述符

Linux文件锁学习-flock, lockf, fcntl

参考  linux中fcntl().lockf.flock的区别 这三个函数的作用都是给文件加锁,那它们有什么区别呢? 首先flock和fcntl是系统调用,而lockf是库函数.lockf实际上是fcntl的封装,所以lockf和fcntl的底层实现是一样的,对文件加锁的效果也是一样的.后面分析不同点时大多数情况是将fcntl和lockf放在一起的. 下面首先看每个函数的使用,从使用的方式和效果来看各个函数的区别. 1. flock l 函数原型 #include<sys/file.h> i

[APUE]不用fcntl实现dup2函数功能

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

文件操作篇 close creat dup dup2 fcntl flock fsync lseek mkstemp open read sync write

文件操作篇 close creat dup dup2 fcntl flock fsync lseek mkstemp open read sync write close(关闭文件) 相关函数 open,fcntl,shutdown,unlink,fclose 表头文件 #include<unistd.h> 定义函数 int close(int fd); 函数说明 当使用完文件后若已不再需要则可使用close()关闭该文件,二close()会让数据写回磁盘,并释放该文件所占用的资源.参数fd为

UNIX环境编程学习笔记(5)——文件I/O之fcntl函数访问已打开文件的性质

lienhua342014-08-29 fcntl 函数可以改变已打开的文件的性质. #include <fcntl.h> int fcntl(int filedes, int cmd, ... /* int arg */); fcntl 函数有 5 种功能: 1. 复制一个现有的描述符(cmd=F_DUPFD). 2. 获取/设置文件描述符标志(cmd=F_GETFD 或F_SETFD). 3. 获取/设置文件状态标志(cmd=F_GETFL 或F_SETFL). 4. 获取/设置异步 I/