网站大量收购闲置独家精品文档,联系QQ:2885784924

跟我学Linu编程-3-输入输出.doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
跟我学Linu编程-3-输入输出

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命令查看程序句柄,

文档评论(0)

guf825 + 关注
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档