- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux编程中的输入输出,如果只从C语言角度来看,可以说也没有什么特殊之处,本章节也并不打算花笔墨来介绍printf,scanf的用法。但如果从Linux系统角度去看,又有不少有意思有东西,如输入输出重定向,管道,彩色字符显示等等,值得玩耍一翻,这才是接下来要我要介绍的重点。
Linux程序,运行后,通常会打开三个文件,其编号分别为0,1,2(我们称之为句柄号)。其中0是标准输入,1是标准输出,2为错误输出。我们来看个例子:
程序什么也不做,一直sleep循环,以便于我们能够有时间查看它运行时的输入输出文件句柄。执行:
gcc inout.c -o io1
编译完成后,我们执行程序:
./io1
再开一个新终端,执行:
ps -a| grep io1
会得到如下的信息:
26065 pts/25 00:00:00 io1
第一个整数是我们程序的进程编号(每次运行均有可能不一样),我们接下来的命令中需要用到它:
ls /proc/26065/fd –l
会显示这样的信息:
lrwx------ 1 dxl dxl 64 3月 30 09:58 0 - /dev/pts/25
lrwx------ 1 dxl dxl 64 3月 30 09:58 1 - /dev/pts/25
lrwx------ 1 dxl dxl 64 3月 30 09:55 2 - /dev/pts/25
显示的正是进程语法为:gcc inout.c -o io2
./io2
我们会意外发现,”Hello, world!”并没有在屏幕上输出!
我们通过之前所说的方法,来查看
发现,1号文件确实是不存在了。原理也不难理解, printf的作用就是在标准输出(终端屏幕)上显示东西,现在标准输出被关闭了,当然也就什么也显示不出来。
同理,如果close(0),你程序中的scanf就得不到输入内容;close(2),通过perror输出的错误信息将不再被显示。除close外,还有read,write一系列针对文件句柄进行操作的函数,如果将其施加在0, 1, 2这三个文件句柄上,还是有其他发现。如:
wirte(1, “Hello, world!\n”, strlen(“Hello, world!\n”));
其效果等同于我们使用printf来输出Hello, world。
小节:
Linux的标准输入输出,对应0, 1, 2三个文件,使调用printf/scanf外,我们使用文件操作的方式在输入和输出内容。
接下来,我们来说说输入输出重定向的事,首先,我们来看程序例子:
程序要求输入两个整数min, max,并做出相应判断。我们编译并执行程序:
gcc inout.c -o io3
./io3
不出意外,程序会不断闪烁光标提示我们输入,只有输入完数据后才能往下执行,显示结果。这简直没有什么好说的。
接下来,我们在程序目录下创建一个in.txt,使用gedit编辑它,加入两行,每行一个整数,如图:
保存文件,然后我们在终端如此运行io3程序:
./io3 0in.txt
你会意外发现,程序这次居然没有等待用户输入,直接输出结果了,而且min和max还是in.txt的值:
correct! min (12) is not big than max(130)
我们再换个玩法:
./io3 0in.txt 1out.txt
你又会发现,这次程序既不等用户
cat out.txt
你会发现,out.txt文件中,正是我们程序运行要输出的内容!
重定向执行过程和结果
这面的两次运行示例,就是使用了重定向功能才达到了这样的结果。所谓重定向,就是改变输入输出的原来绑定的文件到指定的新文件。在本节开始的时候,我们使用:
ls /proc/pid/fd –l
查看程序文件句柄情况,其显示形式如下:
lrwx------ 1 dxl dxl 64 3月 30 09:58 0 - /dev/pts/25
每行的最后一列,显示的格式是:文件句柄号-句柄绑定的文件。如上面的一行,表示当前的0号句柄(标准输入)绑定的文件是/dev/pts/25(第25号终端),也就是当前的标准输入是从第25号终端获取的,而终端的数据需要用户手动输入,所以在未执行输入重定向前,程序运行到scanf处是要等待用户输入的。
而执行重定向后,如第一个例中的./io3 0in.txt,意思是将0号句柄与in.txt文件绑定,也就是标准输入与in.txt绑定,这时程序执行scanf的时候,是从in.txt里直接读数,而非终端中读数,因此无需用户输入直接就从in.txt获取内容了。
如果你有兴趣,可以在主程序最后的一行加上sleep循环,使用ls命令查看程序句柄,
您可能关注的文档
- 第04章节IP地址子网划分VLSMCIDR.ppt
- 政教主任述职汇报.doc
- 走近经典-让黄金时代熠熠发光.doc
- 第04章节XWindow系统的使用.ppt
- 政治七学年上册知识点归纳.doc
- 政治学基本大学名词解释.doc
- 走进poweropint教学评价.docx
- 第04章计算校验和—2.ppt
- 走进农村-共创和谐策划书.doc
- 第05章节图像复原110504.ppt
- 人教PEP版英语四年级下册全册教学课件(课标版2025年4月修订).pptx
- 磷酸铁锂制备工艺与生产装备优化设计.docx
- Unit 5 I can sing. Lesson 20 课件北京版英语一年级上册.ppt
- Unit 5 Old toys Part B Let's talk课件人教版英语三年级下册.ppt
- Unit 5 Old toys Part B Let's learn课件人教版英语三年级下册.ppt
- Unit 5 Which kind would you like?Lesson 18 课件 北京版英语四年级上册.ppt
- Unit 5 Whose dog is it_ Part B Let's learn 课件人教版英语五年级下册.ppt
- Unit 6 Are you ready_ 课件牛津译林版英语一年级下册.ppt
- Unit 6 I have fifty markers. Lesson 19 课件 北京版英语三年级上册.ppt
- Unit 6 I have fifty markers. Lesson 21 课件 北京版英语三年级上册.ppt
文档评论(0)