文档章节

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

 幸福阶梯
发布于 2017/05/03 22:10
字数 856
阅读 34
收藏 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
深圳
程序员
【Linux】 open/read/write/close等文件系统调用接口以及fd与FILE的比较

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

weixin_38682277
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 中直接 I/O 机制的介绍

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

慎思
2012/07/27
0
1
Linux 调试三剑客——strace,lsof,tcpdump

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

koala bear
2015/01/03
0
0
C语言中使用大括号与给函数命名的正确方法(转载)

使用大括号的正确方法: 在C中,使用大括号的方法无所谓对还是错——只要每个开括号后都有一个闭括号,你的程序中就不再会出现与大括号有关的问题。然而,有三种著名的大括号格式经常被使用:...

oldpan
2014/07/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Bash重定向详解

Bash重定向详解 Bash的重定向指的是将命令的输入和输出导向不同地方,而不是默认的标准输入、标准输出和标准错误。Bash的重定向实际上是对标准输入、标准输出和标准错误的重置,进而将所需输...

小陶小陶
今天
3
0
EventBus原理深度解析

一、问题描述 在工作中,经常会遇见使用异步的方式来发送事件,或者触发另外一个动作:经常用到的框架是MQ(分布式方式通知)。如果是同一个jvm里面通知的话,就可以使用EventBus。由于Event...

yangjianzhou
今天
6
0
OpenCV图像处理实例:libuv+cvui显示摄像头视频

#include <iostream>#include <opencv2/opencv.hpp>#define CVUI_IMPLEMENTATION#include <cvui.h>extern "C"{#include <uv.h>}using namespace std;#define WINDOW_NAM......

IOTService
今天
3
0
openJDK之JDK9的String

1.openJDK8的String 先来看下openJDK8的String的底层,如下图1.1所示: 图1.1 底层上使用的是char[],即char数组 每个char占16个bit,Character.SIZE的值是16。 2.openJDK9中的String 图2.1...

克虏伯
今天
3
0
UEFI 模式下如何安装 Ubuntu 16.04

作者:知乎用户 链接:https://www.zhihu.com/question/52092661/answer/259583475 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 针对UEFI模式下安装U...

寻知者
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部