linux系统下fcntl函数解析与标准IO函数介绍

—–今天是最后一篇文章关于linux系统下文件io操作了,从明天起开始写文件属性的文章了,欢迎大家来学习,一起进步。(同时也欢迎大家批评指出错误,我会及时纠正过来的)。

一、fcntl函数解析:

1、函数原型:先用man手册来查看fcntl的用法和原型:

linux系统下fcntl函数解析与标准IO函数介绍

int fcntl(int fd, int cmd, … /* arg */ )

参数解析:

fd:文件描述。

cmd:操作命令。

arg:供命令使用的参数(其实就是我们指定的那个文件描述符数字大小)

2、我们只以一个cmd参数为例— F_DUPFD (Duplicate the file descriptor fd using the lowest-numbered available file descriptor greater than or equal to arg. this is different from dup2(2), which uses exactly the file descrip‐tor specified. On success, the new file descriptor is returned);这里主要是说F_DUPFD这个cmd的作用是复制文件描述符(作用类似于dup和dup2),这个命令的功能是从可用的fd数字列表中找一个比arg大或者和arg一样大的数字作为oldfd的一个复制的fd,和dup2有点像但是不同。下面是代码示例:

代码语言:JavaScript代码运行次数:0运行复制

#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#define FILENAME        "a.txt"int main(void){    int fd1 = -1, fd2 = -1;    fd1 = open(FILENAME, O_RDWR | O_CREAT | O_TRUNC, 0644);    if (fd1 < 0)    {            perror("open");            return -1;    }    printf("fd1 = %d.n", fd1);    fd2 = fcntl(fd1, F_DUPFD, 5);    printf("fd2 = %d.n", fd2);    close(fd1);    return -1; }
linux系统下fcntl函数解析与标准IO函数介绍

注:fcntl函数的cmd操作命令还有好多,这里只是起一个抛砖引玉的作用,哈哈哈。

二、标准IO介绍:

1、什么是标准IO,什么又是文件IO?

标准IO是C库函数;而文件IO是linux系统的API,API类似于一种接口,是由操作系统提供的(说实话,在这之前,我这个人比较犟,好少会调用api,非得自己写一个函数,这样有的时候累的半死还不一定能够写出来;而直接用官方给的api函数,可以提高开发效率,节省时间,人力,哈哈哈。)

2、库函数比API还有一个优势就是:API在不同的操作系统之间是不能通用的,但是C库函数在不同操作系统中几乎是一样的。【所以C库函数具有可移植性而API不具有可移植性。性能上和易用性上看,C库函数一般要好一些。譬如IO,文件IO是不带缓存的,而标准IO是带缓存的,等到合适的时间,我们的操作系统才会把写在缓冲区里的内容真正搞到下一层去。因此标准IO比文件IO性能要更高(这里的下一层是指硬件层存储区域,而我们的标准IO函数是应用层方面,它先向系统缓冲区操作,然后等待系统里面的write等函数操作,才把数据弄到硬件层上去)。

3、常用标准IO函数介绍:

常见的标准IO库函数有:fopenfclose、fwrite、fread、ffulsh(刷新标准库函数的缓存,直接写进操作系统的缓冲区中)、fseek(其实在写这个的话,我自己也对这些函数的用法是一脸的懵逼,还是用man手册去查看他们的用法,才稍微基本会用了,所以这里我举一个例子,也是其抛砖引玉的作用);这里以fopen、fclose、fwrite、fread为例:

linux系统下fcntl函数解析与标准IO函数介绍

这里只查看了fopen的使用,更多使用,大家可以用 man 3 + 标准IO函数查看来查看它们各自的具体用法,这里我就不一一介绍了,代码示例:

代码语言:javascript代码运行次数:0运行复制

#include <stdio.h>              // standard input output#include <stdlib.h>#include <string.h>#define FILENAME        "a.txt"int main(void){    FILE *fp = NULL;    size_t len = -1;    //int array[10] = {1, 2, 3, 4, 5};    char buf[100] = {0};    fp = fopen(FILENAME, "r+");//r+表示可读可写    if (NULL == fp)    {            perror("fopen");            exit(-1);    }    printf("fopen success. fp = %p.n", fp);    // 在这里去读写文件    memset(buf, 0, sizeof(buf));//清除缓存区buf    len = fread(buf, 1, 10, fp);    // The function fread() reads nmemb items of data, each size bytes long, from the stream pointed to by stream, storing them at the location given by ptr.    printf("len = %ld.n", len);    printf("buf is: [%s].n", buf);    fclose(fp);    return 0;}
linux系统下fcntl函数解析与标准IO函数介绍

下面是写操作的代码演示:

代码语言:javascript代码运行次数:0运行复制

#include <stdio.h>              // standard input output#include <stdlib.h>#include <string.h>#define FILENAME        "a.txt"int main(void){    FILE *fp = NULL;    size_t len = -1;    int array[10] = {3,5,6,6,9};    fp = fopen(FILENAME, "w+");    if (NULL == fp)    {            perror("fopen");            exit(-1);    }    printf("fopen success. fp = %p.n", fp);    // 在这里去读写文件    len = fwrite(array, sizeof(int),   sizeof(array)/sizeof(array[0]), fp);// sizeof(array)/sizeof(array[0])中sizeo(array)表示总数组的大 小,sizeof(array[0])表示一个元素的大小,所以整个式子表示数组   的元素个数    //  The function fwrite() writes nmemb items of data, each size bytes long, to the stream pointed to by stream, obtaining them from the location given by ptr.    printf("len = %ld.n", len);    fclose(fp);    return 0;}
linux系统下fcntl函数解析与标准IO函数介绍

三、总结:

通过这一段时间的学习,自己已经掌握了基本的文件IO操作了,接下来还是要多多实践来提高自己。

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享