文档章节

Linux程序设计——write和read系统调用介绍

 幸福阶梯
发布于 2017/05/03 22:10
字数 856
阅读 37
收藏 1

每个运行中的程序称为进程,它有一些与之关联的文件描述符。这是一些小值整数,你可以通过它们访问打开的文件或设备。有多少文件描述符可用取决于系统的配置情况。当一个程序开始运行时,它一般会有3个已经打开的文件描述符:

0:标准输入;

1:标准输出;

2:标准错误输出;

你可以通过系统调用open函数把其他文件描述符与文件和设备相关联,稍后讲解。其实使用自动打开的文件描述符就已经可以通过write系统调用来创建一些简单的程序了。

1.write系统调用:

系统调用write的作用是把缓冲区buf的前nbytes字节写入与文件描述符fildes关联的文件中。它返回实际写入的字节数。如果文件描述符有错误或者底层的设备驱动程序对数据块长度比较敏感,该返回值可能会小于nbytes。如果这个函数返回0,就表示为写入任何数据;如果它返回的是-1,就表示在write调用中出现了错误,错误代码保存在全局变量errno里。

下面是write系统调用的原型:

#include<unistd.h>

size_t write(int fildes, const void *buf, size_t nbytes);

有了这些知识,你就可以编写第一个程序simple_write.c了:

#include<unistd.h>

#include<stdlib.h>

int main()

{

if((write(1,"Here is some data\n",18)) !=18)

{

write(2, "A write error has occurred on file descriptor\n",46);

}

exit(0);

}

这个程序只在标准输出上显示一条消息。当程序退出运行时,所有已经打开的文件描述符都会自动关闭,所以你不需要明确的关闭它们。

编译程序:

gcc -o simple_write simple_write.c

生成:simple_write可执行文件;

运行程序:./simple_write

程序输出:Here is some data

2.read系统调用:

系统调用read的作用是:从与文件描述符fildes相关联的文件里读入nbytes个字节的数据,并把它们放到数据区buf中。它返回实际读入的字节数,这可能会小于请求的字节数。如果read调用返回0,就表示未读入任何数据,已到达了文件尾。同样,如果返回-1,就表示read调用出现了错误。

下面是read系统调用的原型:

#include<unistd.h>

size_t  read(int fildes, const void *buf, size_t nbytes);

下面这个程序simple_read.c把标准输入的前128个字节复制到标准输出。如果输入少于128个字节,就把它们全体复制过去。

#include<unistd.h>

#include<stdlib.h>

int main()

{

char buffer[128];

int nread;

nread = read(0, buffer, 128);

if(nread==-1)

{

write(2, "A read error has occurred\n", 26);

}

if((write(1, buffer, nread)) != nread)

{

write(2, "A write error has occurred\n", 27);

}

exit(0);

}

编译程序:gcc -o simple_read simple_read.c

生成simple_read可执行文件;

运行程序:echo hello there | ./simple_read

程序输出:hello there

运行程序时,你使用echo通过管道为程序提供输入。

执行程序:./simple_read < simple_read.c

输出:

#include<unistd.h>

#include<stdlib.h>

int main()

{

char buffer[128];

int nread;

nread = read(0, buffer, 128);

if(nreadandroid@android-caihaitao:~/linux_test$

请注意,下一个shell提示符出现在输出数据最后一行的尾部,因为在这个例子中,128个字节的数据并没有构成一个完成的行。

 

 

 

© 著作权归作者所有

共有 人打赏支持
粉丝 1
博文 92
码字总数 159283
作品 0
深圳
程序员
私信 提问
为 Unix 程序员准备的 Windows 异步 I/O 教程

在阅读之前,我认为你已经掌握了Unix系统上的非阻塞的Socket I/O。 同样的,在Windows系统上也能够找到select这个系统调用。但是,select 在文件描述上实现的是一个O(n)的算法,他并不像现在...

oschina
2014/04/01
5.7K
14
【Linux】 open/read/write/close等文件系统调用接口以及fd与FILE的比较

在Linux系统下,一切皆文件。因此文件是一个很重要的概念,接下来就介绍一下其相关的文件接口函数。 一、open/read/write/close等文件系统调用接口说明 1.open函数 注释: (1)函数说明:用...

weixin_38682277
2018/04/18
0
0
文件I/O:通用的 I/O 模型 — Go 封装

文件I/O:通用的 I/O 模型 — Go 封装 Go语言学习园地博客2016-06-09160 阅读 本文介绍 Unix I/O 模型中的4个通用系统调用:open()、read()、write()和close() 的 Go 语言封装。 1、Linux 中...

Go语言学习园地博客
2016/06/09
0
0
Linux 调试三剑客——strace,lsof,tcpdump

Brendan D. Gregg 专注 Linux performance & tuning 许多年,其博客 brendangregg.com 里关于分析和调优的干货琳琅满目。一篇名为 Linux Performance 文章全面而详细的整理了常用工具,覆盖了...

koala bear
2015/01/03
0
0
Linux 中直接 I/O 机制的介绍

Linux 中直接 I/O 机制的介绍 简介: 对于传统的操作系统来说,普通的 I/O 操作一般会被内核缓存,这种 I/O 被称作缓存 I/O。本文所介绍的文件访问机制不经过操作系统内核的缓存,数据直接在...

慎思
2012/07/27
0
1

没有更多内容

加载失败,请刷新页面

加载更多

详解webpack-dev-server的简单使用

webpack-dev-server是一个小型的Node.js Express服务器,它使用webpack-dev-middleware来服务于webpack的包,除此自外,它还有一个通过Sock.js来连接到服务器的微型运行时. 我们来看一下下面的...

前端攻城老湿
24分钟前
0
0
深度解析JavaScript事件对象

这篇文章主要介绍了JavaScript事件对象,结合实例形式深入分析了javascript DOM、IE及其他浏览器相关事件对象操作技巧与注意事项,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可...

前端攻城小牛
25分钟前
0
0
Android下拉刷新开源框架

添加依赖 //下拉刷新 implementation 'com.jcodecraeer:xrecyclerview:1.5.9' xml引用 <com.jcodecraeer.xrecyclerview.XRecyclerView android:id="@+id/act_xrecycler......

lanyu96
31分钟前
0
0
Linux内核中ioremap映射的透彻理解

几乎每一种外设都是通过读写设备上的寄存器来进行的,通常包括控制寄存器、状态寄存器和数据寄存器三大类,外设的寄存器通常被连续地编址。根据CPU体系结构的不同,CPU对IO端口的编址方式有两...

天王盖地虎626
35分钟前
1
0
Collection中的之retainAll()方法的理解

//在jdkapi中的方法,说明返回值为boolean类型, boolean retainAll(Collection<?> c) ; //api中给的注释 //Retains only the elements in this list that are contained in the specified......

南桥北木
38分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部