前言

在Linux系统中,一切设备都看作文件。而每打开一个文件,就有一个代表该打开文件的文件描述符。程序启动时默认打开三个I/O设备文件:标准输入文件stdin,标准输出文件stdout,标准错误输出文件stderr,分别得到文件描述符 0, 1, 2。

实例

现在来看一个 测试ttyname函数的实例(ttyname函数功能是返回在该文件描述符上打开的终端设备的路径名):

#include "apue.h"

int

main(void)

{

char *name;

if(isatty(0))

{

name = ttyname(0);

if(name == NULL)

name = "undefined";

}

else

{

name = "not a tty";

}

printf("fd 0: %s\n", name);

if(isatty(1))

{

name = ttyname(1);

if(name == NULL)

name = "undefined";

}

else

{

name = "not a tty";

}

printf("fd 1: %s\n", name);

if(isatty(2))

{

name = ttyname(2);

if(name == NULL)

name = "undefined";

}

else

{

name = "not a tty";

}

printf("fd 2: %s\n", name);

exit(0);

}

运行该程序得到:

从程序运行结果来看,在文件描述符0、1和2上打开的终端设备都是/dev/tty1. 那么疑问就来了,前言中明确指出文件描述符0、1和2是打开标准输入文件stdin,标准输出文件stdout和标准错误输出文件stderr分别得到的。那么文件描述符0、1和2到底是打开哪个文件得到的呢?这里该如何解释呢???望懂得其中缘由者指点一二,小弟万分感谢!

自我解答

如果从shell中运行一个进程,默认会有3个文件描述符存在(0、1、2), 0与进程的标准输入相关联,1与进程的标准输出相关联,2与进程的标准错误输出相关联。文件描述符0、1、2默认打开为标准输入、标准输出和标准出错,这是肯定的。打开一终端设备(如/dev/tty),自然也得到一个文件描述符(ttyfiledes),然后把为终端设备打开的文件描述符复制到标准输入、标准输出和标准出错,比如使用如下语句实现复制:

dup2(ttyfiledes, 0);

dup2(ttyfiledes, 1);

dup2(ttyfiledes, 2);

这样的话,文件描述符0、1、2就关联到了/dev/tty.

此后再执行输入和输出的话,对象都是终端设备/dev/tty了。也就是说,输入是从终端设备/dev/tty读取数据,而输出则是将数据写到终端设备/dev/tty.

上面的解答只是个人的猜想,不知是否正确,不过至少这是一个让自己感觉还算合理的解释。如解释不恰当,还望高手赐教!

 继续自解:

每一个进程都有自己的标准输入文件、标准输出文件和标准出错文件(应该是系统自动分配的)。而且系统默认自动为进程的标准输入文件在文件描述符0上打开,标准输出文件在文件描述符1上打开,标准出错在文件描述符2上打开。通常情况下,是将输入设备(键盘)打开并复制到进程的标准输入(0)、将输出设备(显示器)打开并复制到标准输出(1)和标准出错(2)。

(文件描述符0、1、2),(stdin、stdout、stderr),(终端设备)这三者之间的关系???的更多相关文章

  1. file descriptor 0 1 2 一切皆文件 stdout stderr stdin /dev/null 沉默是金 pipes 禁止输出 屏蔽 stdout 和 stderr 输入输出重定向 重定向文件描述符

    movie.mpeg.001 movie.mpeg.002 movie.mpeg.003 ... movie.mpeg.099   $cat movie.mpeg.0*>movie.mpeg   ...

  2. Linux 文件描述符和重定向

    200 ? "200px" : this.width)!important;} --> 介绍 文件描述符是与文件输入.输出相关联的整数,在编写脚本时会经常使用标准的文件描述符 ...

  3. 用户态与内核态 & 文件流与文件描述符 简介【转】

    转自:https://www.cnblogs.com/Jimmy1988/p/7479856.html 用户态和内核态 程序代码的依赖和调用关系如下图所示: Lib:标准ASCI C函数,几乎所有的平 ...

  4. 用户态与内核态 & 文件流与文件描述符 简介

    用户态和内核态 程序代码的依赖和调用关系如下图所示: Lib:标准ASCI C函数,几乎所有的平台都支持该库函数,因此依赖该库的程序可移植性好: System Function:系统调用函数,与系统内 ...

  5. shell文件描述符和重定向

    1.文件描述符是与一个打开的文件或数据流相关联的整数.文件描述符0,1,2是系统预留的. 0 --------stdin(标准输入) 1 --------stdout(标准输出) 2--------- ...

  6. 文件描述符file descriptor与inode的相关知识

    每个进程在Linux内核中都有一个task_struct结构体来维护进程相关的 信息,称为进程描述符(Process Descriptor),而在操作系统理论中称为进程控制块 (PCB,Process ...

  7. 玩转Linux文件描述符和重定向

    本文介绍linux中文件描述符与重定向的相关知识,文件描述符是与文件输入.输出相关联的整数,它们用来跟踪已打开的文件.有需要的朋友参考下. 原文出处:http://www.jbxue.com/arti ...

  8. Linux 文件描述符详解

    Overview 了解Linux怎样处理输入和输出是非常重要的.一旦我们了解其原理以后,我们就可以正确熟练地使用脚本把内容输出到正确的位置.同样我们也可以更好地理解输入重定向和输出重定向. Linux ...

  9. 18 shell 重定向以及文件描述符

    1.对重定向的理解 2.硬件设备和文件描述符 文件描述符到底是什么 3.Linux Shell 输出重定向 4.Linux Shell 输入重定向 5.结合Linux文件描述符谈重定向 6.Shell ...

随机推荐

  1. brew 更新

    更新: brew update brew update —system 安装, 如:brew install unrar 卸载, 如:brew uninstall unrar

  2. 解决SQL Server Always 日志增大的问题-摘自网络

    配置了Alwayson之后,因为没有只能使用完全恢复模式,不能使用简单或大容量日志模式,所以日志不断增长,不能使用改变恢复模式的方式清空日志 手动操作收缩或截断日志也无效 读了一些文章后发现,有人使用 ...

  3. android 开发必用的开源库

    LogReport:  https://github.com/wenmingvs/LogReport,   崩溃日志上传框架 wcl-permission-demo:Android 6.0 - 动态权 ...

  4. Linux中内存查看命令free详解(转)

    add by zhj:说了那么多,其实看第一行就足够了,free项就是未使用的内存.其实,我是感觉压根就没必要 使用free命令,用top代替就行了 原文:http://liustb.blog.163 ...

  5. C# Common Keyword

    [C# Common Keyword] 1.abstract Use the abstract modifier in a class declaration to indicate that a c ...

  6. hdu 2899 Strange fuction

    http://acm.hdu.edu.cn/showproblem.php?pid=2899 Strange fuction Time Limit: 2000/1000 MS (Java/Others ...

  7. 配置cisco路由器特定时间重启

    方法一: Router1#reload in 20 Reload scheduled for 11:33:53 EST Sat Feb 1 2003 (in 20 minutes) Proceed w ...

  8. iOS面向编码|iOSVideoToolbox:读写解码回调函数CVImageBufferRef的YUV图像

    iOS面向编码|iOSVideoToolbox:读写解码回调函数CVImageBufferRef的YUV图像 本文档基于H.264的解码,介绍读写Video Toolbox解码回调函数参数CVImag ...

  9. 用DependanceProperty做Dynamic换Icon

    1:做Icon用Canvas还是DrawingBrush? Canvas的例子:

  10. Server-U与IIS端口占用问题解决

    在新版的ftp软件Server-U(11.X)中,由于其默认设置中监听了80端口,经常会导致IIS不能服务不能正常启用,下面记录如何修改server-u的80端口.     打开Server-U软件, ...