笔记整理—内核!启动!—linux应用编程、网络编程部分(3)文件共享与标准IO
文件共享是指同一个文件被多个独立的读写进行操作。同一个文件为同一个inode,同一个pathname也就是同一个静态文件。同时进行操作,打开一个文件未关闭又被另一个操作打开。文件共享的方式可以实现高效的大文件读写。
文件共享的三种方式:①同一个进程多个open。②不同进程同时打开文件open(可能为同一个fd数字)。③dup与dup2 API函数,用于复制文件描述符实现接续(指向同一个文件表,用同一个lseek)。
fd最早的起始数字为0,此后以此增加。fd可以因close()被释放,系统会进行重新分配。fd在进程中0、1、2默认被系统占用。用户得到的最小fd为3。fd0~2分别为stdin、stdout、stderr,也就是标准输入、标准输出、标准错误。fprintf()可以指定输出到某个fd中。
dup与dup2函数:
fd1=open(FILENAME,O_RDWR|O_TRUNC,0644);
fd2=dup(fd1);此时的fd1=3,fd2=4 但是指向同一个lseek。
dup不饿指定新文件描述符的数字,dup2修复了这个问题。
fd2=dup2(fd1,16);
dup2所实现的lseek也是同一个,write与read是接续的
当close(0)或者1.2后可以重新使用dup(0~2)打开,实现标准输入/输出/错误的重定位。
close(1);
设fd1指向1.txt文件
fd2=dup(fd1);
printf("fd2=%d\n",fd2);此时fd2分配fd值为1
fd=1为标准输出,所以printf不会将信息打印在屏幕,而是输出在1.xtx文件中
命令行重定位使用“>”,终端打印默认是stdio(也就是标准输入输入):man2 dup > 1.txt。实现的原理就是close(1)与dup()。
fcntl()函数,可用于管理文件描述符,本质上fcntl是一个多功能函数。fcntl(fd,cmd,变参...);cmd:F_xxx,例如F_DUPFD复制文件描述符类似dup与dup2,找到一个大于等于变参的数字并返回。使用这个函数要比dup2更好一些,dup2如果指定的数字被占用,会err,而F_DUPFD会去找一个大于等于这个数字的fd。
C库函数是对API的封装,要比系统提供的一些API好用,API在不同的系统是不通用的,但C库函数是通用的,C库函数具有可移植性,库函数有缓冲区。
常用的标准IO:fopen、fclose、fwrite、fread、ffulsh等。对于fopen而言为fopen(*path,*mode)。mode有r只读、r+可读/写指向文件头,文件不存在就报错、w只写、w+可读/写,文件不存在则会创建、a指向文件尾、a+可读可写,接续写,不存在就新建。
TILE *fp=NULL;
fp=fopen(FILENAME,a+);
if(NULL==fp)
{perror("fopen");exit(-1);
}
size_t len=-1;
len=fwrite("abcde",1,5,fp);int array[10]={1,2,3,4,5};
len=fwrite(array,sizeof(int),sizeof(array)/sizeof(array[0]),fp);
char buf[100]={0};
memset(buf,0,sizeof(buf));
len=fread(buf,sizeof(char),10,fp);