简介

在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作用一样,但过程不一样,dup2会将第二个参数的文件描述符关闭, 然后再复制文件标识

下面的例子将STDOUT_FILENO转接到test.txt文件, 于是printf打印的字符串不会显示在终端窗口, 而是写入到文件中

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h> void err_quit(const char *str){
perror(str);
exit(1);
} int main(){
int fd;
if((fd=open("./test.txt",O_RDWR|O_CREAT|O_TRUNC))<0)
err_quit("open error"); char *str="this is a test\n" ;
if(dup2(fd,STDOUT_FILENO)<0)
err_quit("dup2 error");
printf("%s",str);
return 0;
}

linux 非缓冲io笔记的更多相关文章

  1. Linux非阻塞IO(六)使用poll实现非阻塞的服务器端

    关于poll模型监听的事件以及返回事件,我们定义宏如下: #define kReadEvent (POLLIN | POLLPRI) #define kWriteEvent (POLLOUT | PO ...

  2. Linux非阻塞IO(五)使用poll实现非阻塞的回射服务器客户端

    前面几节我们讨论了非阻塞IO的基本概念.Buffer的设计以及非阻塞connect的实现,现在我们使用它们来完成客户端的编写. 我们在http://www.cnblogs.com/inevermore ...

  3. Linux非阻塞IO(四)非阻塞IO中connect的实现

    我们为客户端的编写再做一些工作. 这次我们使用非阻塞IO实现connect函数. int connect(int sockfd, const struct sockaddr *addr, sockle ...

  4. Linux非阻塞IO(三)非阻塞IO中缓冲区Buffer的实现

    本文我们来实现回射服务器的Buffer.   Buffer的实现   上节提到了非阻塞IO必须具备Buffer.再次将Buffer的设计描述一下: 这里必须补充一点,writeIndex指向空闲空间的 ...

  5. Linux非阻塞IO(二)网络编程中非阻塞IO与IO复用模型结合

    上文描述了最简易的非阻塞IO,采用的是轮询的方式,这节我们使用IO复用模型.   阻塞IO   过去我们使用IO复用与阻塞IO结合的时候,IO复用模型起到的作用是并发监听多个fd. 以简单的回射服务器 ...

  6. Linux非阻塞IO(八)使用epoll重新实现非阻塞的回射服务器

    本文无太多内容,主要是几个前面提到过的注意点: 一是epoll的fd需要重新装填.我们将tcp_connection_t的指针保存在数组中,所以我们以这个数组为依据,重新装填fd的监听事件. //重新 ...

  7. Linux非阻塞IO(七)使用epoll重新实现客户端

    使用poll与epoll的区别主要在于: poll可以每次重新装填fd数组,但是epoll的fd是一开始就加入了,不可能每次都重新加入 于是采用这种策略: epoll除了listenfd一开始就监听r ...

  8. linux文件IO操作篇 (一) 非缓冲文件

    文件IO操作分为 2 种 非缓冲文件IO 和 缓冲文件IO 它们的接口区别是 非缓冲 open() close() read() write() 缓冲 fopen() fclose() fread() ...

  9. 《linux设备驱动开发详解》笔记——8阻塞与非阻塞IO

    8.1 阻塞与非阻塞IO 8.1.0 概述 阻塞:访问设备时,若不能获取资源,则进程挂起,进入睡眠状态:也就是进入等待队列 非阻塞:不能获取资源时,不睡眠,要么退出.要么一直查询:直接退出且无资源时, ...

随机推荐

  1. mina 粘包、多包和少包的解决方法

    转载自:http://freemart.iteye.com/blog/836654 使用过 mina 的同学应该都遇到到过,在解码时少包.多包的问题,查阅了很多资料还是迷迷糊糊的,经过不懈努力,终于解 ...

  2. LearnMVC5-AddAModel

    本人是MVC新手,将从微软官网学习MVC并将看过的英文文档翻译成中文,由于本人英文水平不好,有翻译不准确.错误的地方万望指出,我看到后将会在第一时间修改.另外也希望这一系列文章能为后来者起到引导作用. ...

  3. 各种"居中"

    先看效果 代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> < ...

  4. eclipse bookmark的使用

    为什么要使用bookmark 写代码一般不是从上往下写,经常在几个模块之间变换的写,你可能使用搜索功能ctrl+f,ctrl+c,这样查找位置将会变的非常痛苦. 因为重要的位置一般就那么几个,如定义部 ...

  5. Umbraco(4)-Outputting the Document Type Properties(翻译文档)

    翻译原文地址:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/umbraco4outputting-the-document-typ ...

  6. POJ 2253 Frogger (最短路)

    Frogger Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 28333   Accepted: 9208 Descript ...

  7. POJ 3921 Destroying the bus stations 沿着最短路迭代加深搜索

    题目:给出一个图,问最少删除多少个点,使得从点1到点n经过的点数超过k个. 分析: 上网搜了一下,发现很多人用网络流做的,发现我不会.再后来看到这篇说网络流的做法是错的,囧. 后来发现点数有点少,直接 ...

  8. 从模态视图push到另一个视图

    //需要给模态视图创建一个Nav,然后再调用presentViewController if (_loginVC == nil) { _loginVC = [[LoginViewController ...

  9. Atom 下载、安装

    Atom工具的使用 由github发布的前端开发工具 非常强大的开发工具 官网下载地址:https://atom.io Atom的插件和主题安装和配置

  10. 快速调试chromium

    上一篇我们简单的将了在Ubuntu上编译chromium,android content_shell_apk的编译,一切顺利的就能生成apk.但是我们仅仅只是照搬了人家google开源的东西,作为一个 ...