Linux环境编程之文件I/O(五):fcntl函数

引言:

对于一个普通的文件,我们可以想到的对它的操作有,读取文件的内容、写数据到文件中,这些都是前面提到的read、write函数的作用。除此之外,还可以获取文件的其他性质,并对这些性质进行修改,比如文件的描述符、文件描述符标记、文件状态标志等等。这些对文件性质的修改就由fcntl函数完成。

函数介绍:

#include <unistd.h>

#include <fcntl.h>

int fcntl(int fd, int cmd, ... /* arg */ );

参数:

fd:欲设置的文件描述符。

cmd:打算对文件进行操作的指令。

arg:一般情况下,该参数为一个整数,当使用记录锁时,它指向一个结构的指针。

功能:根据cmd的不同,fcntl函数有以下5种功能:

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)。

详细说明:

1、F_DUPFD

复制文件描述符fd。新文件描述符作为函数值返回。它是尚未打开的个描述符中大于或等于第三个参数(取为整数值)中各值的最小值。新描述符与fd共享同一文件表项。但是新描述符有它自己的一套文件描述符标志,其FD_CLOEXEC文件描述符标志被清除。其实,此时fcntl函数的功能与dup2的功能类似。

/*
 * File Name : fupfd.c
 * Author    : libing
 * Mail      : [email protected]
 * Function  : just for a test
 */
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>

int
main(void)
{
	int fd, newfd;
	fd = open("test.txt", O_RDWR);
	if(fd == -1){
		printf("can‘t open test.txt.\n");
		exit(1);
	}
        //使用fcntl函数复制文件描述符
	newfd = fcntl(fd, F_DUPFD, 5);
	printf("newfd = %d.\n", newfd);

	return 0;
}

编译测试:

编译程序:
gcc fupfd.c
执行程序:
./a.out
测试结果:
newfd = 5.

2、F_GETFD:对应于fd的文件描述符标志作为函数返回。当前仅定义了一个文件描述符标志FD_CLOEXEC。

F_SETFD:对于fd设置文件描述符标志。新标志按第三个参数设置。

3、F_GETFL:对于fd的文件状态标志作为函数值返回。文件状态标志有O_RDONLY、O_WRONLY、O_RDWR等。因为三个访问方式标志并不各占1位。因此首先必须用屏蔽字O_ACCMODE取得访问模式位,然后将结果与这三种值的任一种做比较。

F_SETFL:将文件状态标志设置为第三个参数的值。可以更改的几个标志是:O_APPEND、O_NONBLOCK、O_SYNC、O_DSYNC、O_RSYNC等。

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>

int
main(void)
{
	int val;
	int fd;

	fd = open("test.txt", O_RDWR);
        //fcntl函数获得文件状态标志
	if((val = fcntl(fd, F_GETFL, 0)) < 0)
			printf("fcntl failed.\n");

	switch(val & O_ACCMODE){
	case O_RDONLY:
		printf("read only");
		break;
	case O_WRONLY:
		printf("write only");
		break;
	case O_RDWR:
		printf("read and write");
		break;
	default:
		printf("unknown access mode");
	}

	if(val & O_APPEND)
			printf("append");
	if(val & O_NONBLOCK)
			printf("nonblock");

	putchar(‘\n‘);
	exit(0);
}

编译测试结果:

编译程序:
gcc fcntl.c
执行程序:
./a.out
结果显示:
read and write

4、F_GETOWN:取当前接收SIGIO和SIGURG信号的进程ID或进程组ID。

F_GETOWN:设置接收SIGIO和SIGURG信号的进程ID或进程组ID。

Linux环境编程之文件I/O(五):fcntl函数,布布扣,bubuko.com

时间: 2024-10-05 04:58:09

Linux环境编程之文件I/O(五):fcntl函数的相关文章

Linux环境编程之文件I/O(六):文件属性

引言: 在Linux中使用ls -l filename命令查看filename的属性时,会列出文件的9种属性,例如:ls -l /etc/fstab -rw-r--r-- 1 root root 1102 2013-10-12 02:33 /etc/fstab 从左到右分别是类型与权限.文件个数.该文件或目录的拥有者.所属的组.文件大小.创建时间.文件名 以上这些文件属性的信息,都存放在一个stat的结构体中.下面就来分析一下这个结构体. 要想查看一个文件的stat结构体,可以通过stat类函数

Linux环境编程之文件I/O(七):目录文件及操作

什么是数据结构? 数据结构是相互之间存在一种或多种特定关系的数据元素的集合. 还有一些概念(数据.数据元素.数据项.数据对象.数据类型...) 传统上,我们把数据结构分为逻辑结构和物理结构. 逻辑结构:是指数据对象中数据元素之间的相互关系,也是我们今后最需要关注和讨论的问题. 物理结构:是指数据的逻辑结构在计算机中的存储形式. 逻辑结构分为以下四种: 1.集合:集合结构中的数据元素除了同属于一个集合外,之间没有任何关系. 2.线性结构:元素之间一对一. 3.树形结构:一对多. 4.图形结构:多对

Linux环境编程之文件I/O(三):文件的读写

(一) 当我们打开了一个文件后,一般对文件的操作就是读写.读写函数分别是read.write. #include <unistd.h> ssize_t read(int fd, void *buf, size_t count); 参数: fd:利用open.creat得到的文件描述符. buf:buf是void *类型,用于表示通用指针,此处指所读取到的数据的内存缓冲. count:需要读取的数据量. 返回值:成功执行时,返回所读取的数据的字节数,一般等于或小于所请求读取的数据字节数.若已到文

Linux环境编程之文件I/O(四):文件I/O的数据结构

(一) Linux系统支持不同进程间共享打开的文件.内核使用三种数据结构表示打开的文件:进程表项.文件表项.v节点表. 1.进程表项:每个进程在进程表中都有一个记录项,记录项中年包含有一张打开文件描述符表,可将其视为一个矢量,每个描述符占用一项.与每个文件描述符相关联的是: a.文件描述符标志 b.指向一个文件表项的指针 2.内核为所有打开文件维持一张文件表.每个文件表项包含: a.文件状态标志,如读写.添加.同步和非阻塞等. b.当前文件偏移量 c.指向该文件v节点表项的指针 3.每个打开的文

Linux环境编程之文件I/O(二):文件的打开与关闭

(一) Linux系统中,要对一个文件进行任何操作,必须首先获得它的文件描述符.而获得文件描述符的方式就是利用open/creat函数打开/创建该文件,open/creat函数返回文件描述符. #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open(const char *pathname, int flags); int open(const char *pathname, in

Linux环境编程之文件I/O(一):文件描述符

(一) 首先,对于内核来讲,它是利用"文件描述符"来访问文件的.文件描述符一般是一个非负的整数.当我们用open打开已有的文件或者用creat创建新的文件时,都会返回一个文件描述符.有了文件描述符之后,我们就可以利用该文件描述进行文件的读写,即read.write系统调用都需要文件描述符fd(file descriptor)作为其参数.从以上描述可以看出,当我们想要用read.write等系统调用对文件进行读写等操作之前,必须用open或creat系统调用得到文件的描述符. 一般Uni

Linux环境编程之文件I/O(八):文件链接

引言: 执行如下命令时, ls /usr/local/lib/libfreetype.so -l 显示内容: lrwxrwxrwx 1 root root 20 2014-04-06 22:57 /usr/local/lib/libfreetype.so -> libfreetype.so.6.9.0 表明这是一个链接文件,通过链接可以实现对一个文件从不同路径对它进行引用.对于文件的链接有硬链接和软连接(即符号链接)之分.shell中的ln命令可以创建一个文件的硬链接,加上-s选项可以创建一个文

[linux环境编程] 信号的基本概念与操作函数

[linux环境编程] 信号的基本概念与操作函数 一.基本的概念 1.中断的基本概念 中断是指在CPU正常运行期间,由于内外部事件或由程序预先安排的事件引起的CPU暂时停止正在运行的程序,转而为该内部或外部事件或预先安排的事件服务的程序中去,服务完毕后再返回去继续运行被暂时中断的程序. 而在Linux中通常分为外部中断(又叫硬件中断)和内部中断(又叫异常). 硬中断:来自硬件设备的中断 软中断:来自其它程序的中断 2.信号的基本概念 信号是软件中断,提供了一种处理异步事件的方法,可以把他看作是进

Linux环境编程之信号(三):一些信号函数

(一)kill和raise函数 kill函数将信号发送给进程或进程组.raise函数则允许进程自身发送信号. #include <sys/types.h> #include <signal.h> int kill(pid_t pid, int sig); int raise(int  signo);  //返回值:若成功则返回0,若出错则返回-1. 参数:pid参数有4种情况:1.pid > 0 将信号发送给进程为pid的进程.2.pid == 0 将该信号发送给与发送进程属