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
linux重定向
第一个整数是我们程序的进程编号(每次运行均有可能不一样),我们接下来的命令中需要用到它:
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
显示的正是进程26065当前打开的文件句柄,共有3行,正是我上面所说的3个文件。
终端运行过程及结果
Linux系统,程序打开的文件通常用一个整数句柄来表式。我们可以调用close()函数来关闭它。语法为:
int close(int fd)
其中,fd为文件句柄。程序默认打开的标准输入输出文件句柄,也可以通过close来关闭。我们接下来实验一下关闭0号文件会有什么现像发生:
编译并执行:
gcc inout.c -o io2
./io2
我们会意外发现,”Hello, world!”并没有在屏幕上输出!
我们通过之前所说的方法,来查看io2的文件句柄打开情况:
发现,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 0&
你会意外发现,程序这次居然没有等待用户输入,直接输出结果了,而且min和max还是in.txt的值:
correct! min (12) is not big than max(130)
我们再换个玩法:
./io3 0& 1&
你又会发现,这次程序既不等用户输入,也没输出任何内容,就运行结束了。执行:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。