博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UNIX基础知识之输入和输出
阅读量:5213 次
发布时间:2019-06-14

本文共 2177 字,大约阅读时间需要 7 分钟。

一、文件描述符

  文件描述符(file descriptor)通常是一个小的非负整数,内核用它标识一个特定进程正在访问的文件。当内核打开一个已有文件或创建一个新文件时,它返回一个文件描述符。在读、写文件时,就可以使用它。

二、标准输入、标准输出和标准出错

  按惯例,每当运行一个新程序时,所有的shell都会为其打开三个文件描述符:标准输入(standard input)、标准输出(standard output)以及标准出错(standard error)。如果没有做什么特殊处理(如重定向),则这三个描述符都链向终端。

三、不用缓冲的I/O

  函数open、read、write、lseek以及close提供了不用缓冲的I/O。这些函数都使用文件描述符。

  程序清单1-2 将标准输入复制到标准输出

[root@localhost unix_env_advance_prog]# cat prog1-2.c #include "apue.h"#define BUFFSIZE        4096intmain(void){        int     n;        char    buf[BUFFSIZE];        while((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0)                if(write(STDOUT_FILENO, buf, n) != n)                        err_sys("write error");        if(n < 0)                err_sys("read error");        exit(0);}

 

  头文件<unistd.h>(apue.h中包含了此头文件)及两个常量STDIN_FILENO和STDOUT_FILENO是POSIX标准的一部分。该头文件包含了很多UNIX系统服务的函数原型。

  两个常量STDIN_FILENO和STDOUT_FILENO定义在<unistd.h>头文件中,它们指定了标准输入和标准输出的文件描述符。它们的典型值分别是0和1,但是考虑到可移植性,我们将使用新名字。

  read函数返回读得多字节数,此值用作要写的字节数。当到达文件尾端时,read返回0,程序停止执行。如果发生了一个读错误,read返回-1.出错时大多数系统函数返回-1.

  prog1-2.c编译成功后,以下列方式执行它:

[root@localhost unix_env_advance_prog]# ./prog1-2 > data

  那么,标准输入是终端,标准输出则重新定向至文件data,标准出错也是终端。如果此输出文件并不存在,那么shell会创建它。该程序将用户键入的各行复制至标准输出,键入文件结束字符(通常是Ctrl+D)时,则终止该次复制。

  若以下列方式执行该程序:

[root@localhost unix_env_advance_prog]# ./prog1-2 < infile > outfile

  那么名为infile文件的内容复制到名为outfile的文件中。

四、标准I/O

  标准I/O函数提供一种对不用缓冲I/O函数的带缓冲的接口。使用标准I/O函数可以无需担心如何选取最佳的缓冲区大小,例如prog1-2中的BUFFSIZE常量的大小。使用标准I/O函数的另一个优点是简化了对输入行的处理(常常发生在UNIX的应用中)。例如,fgets函数读一完整的行,而read函数读指定字节数。

  我们最熟悉的标准I/O函数是printf。在调用printf的程序中,总是包括<stdio.h>,该头文件包括了所有标准I/O函数的原型。

  程序清单1-3 用标准I/O将标准输入复制到标准输出

[root@localhost unix_env_advance_prog]# cat prog1-3.c #include "apue.h"intmain(void){        int     c;        while((c = getc(stdin)) != EOF)                if(putc(c, stdout) == EOF)                        err_sys("output error");        if(ferror(stdin))                err_sys("input error");        exit(0);}

  函数getc一次读一个字符,然后函数putc将此字符写到标准输出。读到输入的最后1个字节时,getc返回常量EOF,该常量在<stdio.h>中定义。标准输入/标准输出常量stdin和stdout也定义在头文件<stdio.h>中,它们分别表示标准输入和标准输出文件。

 

本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:

转载于:https://www.cnblogs.com/nufangrensheng/p/3495066.html

你可能感兴趣的文章
springmvc+mybatis整合
查看>>
mysql二进制日志
查看>>
VLOOKUP 函数
查看>>
20165318 2017-2018-2 《Java程序设计》第一周学习总结
查看>>
mysql学习(2)-MySQL服务器优化
查看>>
H5版俄罗斯方块(2)---游戏的基本框架和实现
查看>>
【bzoj4300】绝世好题 dp
查看>>
【bzoj5180】[Baltic2016]Cities 斯坦纳树
查看>>
docker使用
查看>>
Javascript 获得元素位置&&获得元素样式值-网上找的,方便以后查阅
查看>>
【GUI】基于V7开发板的裸机和各种RTOS版本的emWin程序模板,支持硬件JPEG,已发布(2019-05-26)...
查看>>
物联网操作系统HelloX开发者入门指南
查看>>
Hello China操作系统的安装和使用
查看>>
一键生成http服务器
查看>>
[ActionScript 3.0] as3启动QQ
查看>>
对于 yii2 高级模板 生成文件入口
查看>>
C语言math.h库函数中atan与atan2的区别
查看>>
Bresenham算法
查看>>
128 Longest Consecutive Sequence 一个无序整数数组中找到最长连续序列
查看>>
#pragma once
查看>>