Linux_IO基础知识概括

1.IO知识

1.1最先接触的IO知识

#include <stdio.h> #include <unistd.h>

stdandard input output:标准IO (printf/scanf)

input :通过终端向程序输入数据

output:程序的结果通过终端(显示屏等)输出

1.2IO的种类

标准IO :库函数

文件IO :系统调用

1.3什么是系统调用?

系统调用(posix(可移植操作系统的标准)):从用户空间到内核空间的切换过程,不同的操作系统系统调用的接口是不同的。只要从用户空间到内核空间了就要发生一次系统调用,效率比较低。系统调用没有缓冲区。

库函数(ANSI C):库函数的平台的通用新更强,库函数有缓冲区,效率比系统调用高。库函数=缓冲区+系统调用
在这里插入图片描述

1.4常用的函数接口的种类

标准IO:API

printf 
scanf 
fopen 
fread 
fwrite 
fclose  
fgetc 
fputc 
fgets  
fputs
...

文件IO:API

open 
read 
write 
close
...

2.Linux系统中ctags的使用

2.1ctags是什么?

在Linux系统中追代码的一个工具

2.2创建索引

ctags -R =====>tags的索引文件

2.3追代码的使用

vi -t 函数/变量

ctrl+] 在文件内继续跳转

ctrl+t 回退

3.关于缓冲区的问题

3.1缓冲区种类和大小

全缓存:和文件相关的缓冲区就是全缓存 (fp 4096字节)

行缓存:可终端相关的缓冲区是行缓存 (stdin stdout 1024字节)

不缓存:标准出错没有缓冲区(stderr 0字节)

#include <stdio.h>

int main(int argc,const char * argv[])
{
#if 1
    int num;
    // //stdin 行缓存1024
    //标准输入的大小缓冲区是1024字节
    scanf("%d",&num); //必须输入,才能看到大小
    printf("stdin size = %ld\n",
        stdin->_IO_buf_end - stdin->_IO_buf_base);
    //stdout 行缓存1024
     printf("stdout size = %ld\n",
        stdout->_IO_buf_end - stdout->_IO_buf_base);
    //stderr 不缓存0
    printf("stderr size = %ld\n",
        stderr->_IO_buf_end - stderr->_IO_buf_base);
#else
    FILE *fp;

    if((fp = fopen("01fopen.c","r"))==NULL){
        perror("fopen error");
        return -1;
    }
    
    fgetc(fp);
    //全缓存,大小是4K
    printf("fp size = %ld\n",
        fp->_IO_buf_end - fp->_IO_buf_base);

    fclose(fp);
#endif
    return 0;
}

3.2缓冲区刷新时机

3.2.1行缓存的刷新时机

1.行缓存遇到’\n’字符会刷新缓冲区

2.程序执行结束,也会刷新行缓冲区

3.当输入和输出发生切换的时候也会刷新缓冲区

4.当关闭文件指针的时候也会刷新缓冲区

5.fflush主动刷新缓冲区

6.如果(行)缓冲区满了,会刷新缓冲区

#include <stdio.h>
int fflush(FILE *stream);
功能:主动刷新缓冲区
参数:
   @stream:文件指针
返回值:成功返回0,失败返回EOF置位错误码
#include <stdio.h>

int main(int argc,const char * argv[])
{
    //1.行缓存遇到'\n'字符会刷新缓冲区
    // printf("hello world\n");
    // while(1);

    //2.程序执行结束,也会刷新行缓冲区
    // printf("hello world");

    //3.当输入和输出发生切换的时候也会刷新缓冲区
    // int num;
    // printf("hello world");
    // scanf("%d",&num);
    // while(1);

    //4.当关闭文件指针的时候也会刷新缓冲区
    // printf("hello world");
    // fclose(stdout);
    // while(1);

    //5.fflush主动刷新缓冲区
    // printf("hello world");
    // fflush(stdout);
    // while(1);

    //6.如果(行)缓冲区满了,会刷新缓冲区
    int i=0;
    while(i<1029){
        printf("%c",'a');
        i++;
    }
    while(1);

    return 0;
}

3.2.2全缓存的刷新时机

1.程序执行结束,也会刷新全缓存

2.输入输出发生切换的时候,会刷新全缓存

3.关闭文件指针,会刷新全缓存

4.fflush主动刷新缓冲区

5.全缓存满,也会刷新缓冲区

#include <stdio.h>

int main(int argc,const char * argv[])
{
    FILE *fp;

    if((fp = fopen("hello.txt","w+"))==NULL){
        perror("fopen error");
        return -1;
    }
    //1.全缓存遇到换行符不会刷新缓冲区
    // fputc('a',fp);
    // fputc('\n',fp);
    // while(1);

    //2.程序结束,会刷新全缓存
    // fputc('a',fp);
    
    //3.输入输出发生切换的时候,会刷新全缓存
    // fputc('a',fp);
    // fgetc(fp);
    // while(1);

    //4.关闭文件指针,会刷新全缓存
    // fputc('a',fp);
    // fclose(fp);
    // while(1);

    //5.主动调用fflush(fp);
    // fputc('a',fp);
    // fflush(fp);
    // while(1);

    //6.全缓存满,也会刷新缓冲区
    int i=0;
    while(i<4097){
        fputc('a',fp);
        i++;
    }
    while(1);

    return 0;
}

while(1);

//5.主动调用fflush(fp);
// fputc('a',fp);
// fflush(fp);
// while(1);

//6.全缓存满,也会刷新缓冲区
int i=0;
while(i<4097){
    fputc('a',fp);
    i++;
}
while(1);

return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值