linux下IO相关知识

来源:互联网 发布:淘宝一键复制有坏处吗 编辑:程序博客网 时间:2024/06/06 00:56

输入:读,数据由内核空间流向用户空间。

输出:写,数据由用户空间流向内核空间。

库:功能性函数的集合,运行在用户空间,库最终是通过系统调用实现。

系统调用:内核给用户的接口,运行在内核空间。

 

标准IO:操作的是流,是库,带缓存的IO,高级IO

文件IO:操作的是文件描述符,是系统调用,不带缓存(内核缓存),低级IO

 

Man 1 命令  man 2 系统调用  man 3 库  man 7 列表

标准IO流:stdin标准输入,stdout标准输出,stderr标准错误

文件流指针 FILE *

Ctags–R生成tags 在.vimrc里添加tags路径 set tags+=

Vim –t 追各种函数,类型  ctrl+]追踪

缓冲区:在内存开辟,意义,减少系统调用次数

         全缓存:操作文件,4096,刷新用fflush

         行缓存:终端,1024,遇到\n会刷新

         不缓存:不带缓存,对应stderr

 

FILE * fopen(路径,mode(打开方式)):打开文件,获得文件流指针。

r:只读,文件指针指向文件开头,文件不存在,报错。

r+:读写,文件指针指向文件开头,文件不存在,报错。

w:只写,清空,文件指针指向文件开头,文件不存在创建。

w+:读写,清空,文件指针指向文件开头,文件不存在创建。

a:只写,追加,文件指针指向文件末尾,从末尾写,不存在创建。

a+:读写,追加,从文件开头开始读,从末尾开始写,不存在创建。

t:ascii码文件。

b:二进制。

 

函数出错设置errno(错误信息列表),perror(“”)。

 

Fflush(FILE *)刷新缓冲区。

Fclose(FILE *);刷新缓冲区,关闭流。错误返回EOF,设置errno。

Fclose再次调用会产生未知错误。

 

Feof(FILE *)检查是否到达文件末尾,如果末尾返回非零值。

 

fgetc(FILE *)成功返回一个ascii码,错误和到达文件末尾返回EOF

fputc(int,FILE *);错误返回EOF

 

fgets(char *,size,FILE *);读到文件末尾或者\n会停止,最后一个字节填充\0。错误或者到达文件末尾返回值NULL。

Fputs(char *,FILE *);写入到流,忽略\0。

 

Fread(void *,每个对象的大小,要读多少个对象,FILE *);成功返回读到的对象的个数。

到达文件末尾返回0.

Fwrite(void *,每个对象的大小,需要写入的对象的个数,FILE *);

 

Fseek(FILE *,offset,相对的位置);SEEK_SET从文件头开始,SEEK_CUR当前位置,SEEK_END文件末尾。成功返回0,错误返回-1.

Ftell(FILE *);返回当前文件指针位置。

Rewind(FILE *);文件指针偏移到头。

 

t = time(NULL);

 

文件IO

操作的是文件描述符,最小的未用非负整数。

0 1 2是系统预定义的3个描述符,对应标准IO里的stdin,stdout,stderr。

open(路径,flags,mode);

flags:O_RDONLY只读,O_WRONLY只写,O_RDWR读写  --必须有

O_CREAT创建文件(设置权限mode,mode& ~umask,umask文件权限掩码),

O_EXCL检查文件是否存在,不存在报错,errno文件不存在ENOENT。

O_TRUNC清空文件,O_APPEND追加模式。O_NONBLOCK非阻塞。

 

r+:  O_RDWR|O_EXCL

w:  O_WRONLY|O_CREAT|O_TRUNC,0666

a+:O_RDWR|O_CREAT|O_APPEND,0666

 

close(文件描述符); 再次调用close时会产生未知错误。

成功返回0,错误返回-1,设置errno。

 

Read(文件描述符,buf,size);返回值:读到的个数,到达文件末尾返回0,错误返回-1,设置errno。

Bzero(buf,size)清空字符串,置为\0

Memset(buf,ascii,size);字符串置位。

 

Write(同上);同上

Lseek(文件描述符,偏移量,相对位置);相对位置:SEEK_SET,SEEK_CUR,SEEK_END。

返回值:相对文件头的偏移量/位置。

 

Stat(路径,结构)

 

对目录的操作。

Opendir(路径)打开目录,获得目录流

Readdir(DIR *)

 

静态库:lib库名.a

链接时载入静态库,生成目标代码,体积比较大,每生成一个可执行文件,就需要一份静态库,最终可以与静态库断开关系。

生成静态库:1.gcc  –c  文件.c   2.ar -cr  lib库名.a   文件.o

使用静态库:gcc     xxx.c  -L库路径  -l库名
                   拷贝库到/lib或者/usr/lib下然后gccxxx.c  -l库名

 

动态库:lib库名.so   

运行时载入,目标代码体积较小,所有的可执行文件公用一份动态库。

生成动态库:1. gcc–c  -fpic(位置无关码)  文件.c  2. gcc–shared 文件.o  -o  lib库名.so

使用动态库:

将动态库放到/lib或者/usr/lib在LD_LIBRARY_PATH环境变量中加上库所在路径。

添加/etc/ld.so.conf.d/*.conf文件,把库所在的路径加到文件末尾,并执行ldconfig刷新。

gcc    xxx.c  -l库名



0 0
原创粉丝点击