美文网首页程序员
linux 非缓冲io笔记

linux 非缓冲io笔记

作者: 陈伟志 | 来源:发表于2016-06-15 10:59 被阅读0次

简介

在linux中,打开的的文件(可输入输出)标识就是一个int值,如下面的三个标准输入输出
STDIN_FILENO/STDOUT_FILENO/STDERR_FILENO这三个是标准输入输出,对应0,1,2

open(文件路径,读写标识,其它不定参数)
read(文件标识,缓冲区,要读的字节数):从文件中读取指定的字节数到缓冲区,返回值为实际读取的字节
write(文件标识,缓冲区,要写的字节数):将缓冲区中指定的字节数写入到文件中
close(文件标识):关闭文件
读写标识,常用的有O_RDONLY,O_WRONLY,O_RDWR,O_APPEND,O_TRUNC

lseek(文件标识,偏移量,偏移起始位置),其中偏移的起始位置有三个:
SEEK_SET:文件头
SEEK_CUR:当前位置
SEEK_END:文件尾

例1

#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <stdio.h>
#include <unistd.h>

struct people{
    const char name[10];
    int age;
};

int main(){
    int fd;
    if((fd=open("./test_file",O_RDWR|O_TRUNC|O_CREAT))<0){
        perror("open file error");
        return -1;
    }
    struct people a={"zhangsan",20},b={"lisi",40},
                  c={"wangwu",50},d={"zhaoliu",60};
    write(fd,&a,sizeof(a));
    write(fd,&b,sizeof(b));
    write(fd,&c,sizeof(c));
    write(fd,&d,sizeof(d));

    printf("input your choice:");
    int num;
    scanf("%d",&num);
    switch(num){
        case 1:
            lseek(fd,0,SEEK_SET);break;
        case 2:
            lseek(fd,sizeof(struct people),SEEK_SET);break;
        case 3:
            lseek(fd,sizeof(struct people)*2,SEEK_SET);break;
        default:
            lseek(fd,sizeof(struct people)*3,SEEK_SET);
    }

    struct people test;
    if(read(fd,&test,sizeof(struct people))<0){
        perror("read file error");
        return 1;        
    }
    printf("your choice is %s,%d\n",test.name,test.age);
    close(fd);
    return 0;


例子2

dup函数用于将现在的文件标识复制一份给其它人,以达到共享文件的目的
dup2函数与dup作用一样,但过程不一样
如果myin、myout已经有对应的文件管道,dup2会将其关闭(如果myin/myout没初始化会出错),然后再复制文件标识

#include <unistd.h>
#include <stdio.h>
 
int main(){
    int myin=dup(STDIN_FILENO);
    int myout=dup(STDOUT_FILENO);
    //int myin=myout=0;
    //dup2(STDIN_FILENO,myin);
    //dup2(STDOUT_FILENO,myout);
    char buf[100]={0};
    ssize_t s=read(myin,buf,100);
    write(myout,buf,s);
    return 0; 
}

相关文章

  • linux 非缓冲io笔记

    简介 在linux中,打开的的文件(可输入输出)标识就是一个int值,如下面的三个标准输入输出STDIN_FILE...

  • 非缓冲io与缓冲io

    系统调用 在讲解io之前,先介绍下系统调用。系统调用是操作系统内核提供给外部访问的最小接口,运行在内核态,如果应用...

  • 软件架构设计-操作系统

    操作系统 直接IO与缓冲IO 缓冲io又称作标准I/O,大多数文件系统的默认IO操作都是缓冲IO。在linux的缓...

  • Java NIO 和 IO 之间的主要差别

    NIO 和 IO 之间的主要差别 IO NIO 面向流 面向缓冲 阻塞IO 非阻塞IO 无 ...

  • NIO学习笔记(1)

    NIO:(New IO/No blocking IO)非阻塞式IO 新特性:面向缓冲区,Channel,Selec...

  • 【JAVA】总结四

    阻塞IO和非阻塞IO 发送端往缓冲区写入数据,当发送端缓冲区数据满了,发送端write就会阻塞,接收端从接收端缓冲...

  • Linux编程学习笔记 | Linux IO学习[2] - 标准

    在上一篇Linux编程学习笔记 | Linux IO学习[1] - 文件IO中,我总结了Linux下的文件IO。文...

  • IO与NIO

    IO面向流,阻塞。 NIO面向块(面向缓冲区),非阻塞。

  • 2、Linux IO模型

    下图是Linux处理IO调用的流程图: Linux IO模型分为5种: 阻塞IO 非阻塞IO IO复用 事件驱动I...

  • NIO

    一、IO和NIO区别 IO是面向流的,阻塞的,单向的; NIO是面向缓冲的,非阻塞的,双向的; 二、缓冲区 2.1...

网友评论

    本文标题:linux 非缓冲io笔记

    本文链接:https://www.haomeiwen.com/subject/txtpdttx.html