标题:谈谈重定向、管道与C
只看楼主
lishizelibin
Rank: 2
等 级:论坛游民
帖 子:513
专家分:41
注 册:2007-5-10
结帖率:100%
 问题点数:0 回复次数:16 
谈谈重定向、管道与C
我所知道的重定向和管道就这些了,写了一早晨终于写完了,现在接着睡,希望对大家有用。
这是我学习之中知道的一些关于重定向和管道的知识,并积累的资料,在这里和大家分享。如果说的有不足和错误的地方,请指出。毕竟是交流信息。我这里是从DOS和C语言方面看它,没有太多涉及LINUX中所说的。我想从以下几个方面叙述:
一、 重定向:
所谓重定向,就是不使用系统的标准输入端口、标准输出端口或标准错误端口,而进行重新的指定,所以重定向分为输出重定向、输入重定向和错误重定向(注:
STDIN 0 标准输入 键盘 命令在执行时所要的输入数据通过它来取得
STDOUT 1 标准输出 显示器 命令执行后的输出结果从该端口送出
STDERR 2 标准错误 显示器 命令执行时的错误信息通过该端口送出 )。
通常情况下重定向到一个文件。重定向命令又称转向命令。其中错误重定向和输出重定向有些类似,就不多说,学过C++可能会明白的多些。
所谓输出重定向指把执行相应DOS命令时本应在屏幕上显示的内容输出到重定向命令所指向的文件或设备中去。输出重定向命令 > 、>>。它们的区别是:如果你使用的是 > ,原文件会被删除,重新生成新的文件,其内容如上所述;如果你使用的是 >> ,它以追加的方式,将命令的输出写入文件的末尾,原文件内容会被保留,新的内容会添加到原文件件的内容的后面。主要用在某个命令的输出很多,在屏幕上不能完全显示,就可把它重定向到一个文件中,稍后再用文本编辑器来打开这个文件。
输入重定向使输入信息来自文件。如果一个名为file.com的文件C:>file 之后,执行file时所需的处理信息就改为由文件file读入,这就是输入重定向。小于号<是输入重定向操作符,在<之后的文件名或设备名是重定向的输入源。如果一个程序时需要输入较多数据,使用输入重定向可以提高效率。在这里要说一些过滤命令 more 、sort 和 find 。其中more进行分屏显示;find 查找符合条件的内容;sort(按行)排序。
例如:(我是在windows命令提示符中用的)
例1:  
more < f:\turboc2\readme
  more的输入来自 c:\tc\readme 文件内容多。这个命令与
  type f:\turboc2\readme | more
  作用相同,但更简洁,效率也更高。
例2:(注cmd重定向进入后用exit返回原目录)
cmd > file 把 stdout 重定向到 file 文件中
cmd >> file 把 stdout 重定向到 file 文件中(追加)
cmd 1> file 把 stdout 重定向到 file 文件中
cmd > file 2>&1 把 stdout 和 stderr 一起重定向到 file 文件中
cmd 2> file 把 stderr 重定向到 file 文件中
cmd 2>> file 把 stderr 重定向到 file 文件中(追加)
cmd >> file 2>&1 把 stderr 和 stderr 一起重定向到 file 文件中
cmd < file >file2 cmd 命令以 file 文件作为 stdin,以 file2 文件作为 stdout
注:>&n 使用系统复制文件描述符 n 并把结果用作标准输出
<&n 标准输入复制自文件描述符 n
<&- 关闭标准输入(键盘)
>&- 关闭标准输出
n<&- 表示将 n 号输入关闭
n>&- 表示将 n 号输出关闭
&> 同时实现输出重定向和错误重定向
用途:DOS的标准输入输出通常是在标准设备键盘和显示器上进行的, 利用重定向,可以方便地将输入输出改向磁盘文件或其它设备。如在批处理命令执行期间为了禁止命令或程序执行后输出信息而扰乱屏幕, 可用DOS重定向功能把输出改向NUL设备(NUL不指向任何实际设备): C:\>copy a.txt b.txt > NUL。命令执行结束不显示"1 file(s) copied"的信息。有的交互程序在执行时要求很多键盘输入, 但有时输入是固定不变的, 为加快运行速度, 可预先建立一个输入文件,此文件的内容为程序的键盘输入项, 每个输入项占一行。假如有一个程序cx 其输入项全部包括在文件in.dat中, 执行 C:\>cx <in.dat>NUL 程序就自动执行。
二、 管道:
进程从“管道”的一端发送另一端接收,也就是说将若干命令用输入输出“管道”串接在一起,这就是管道;管道在某种程度上是输入和输出重定向的结合,前一个命令的输出,作为下一个命令的输入,而不需要经过任何中间文件。竖线字符“|”是管道操作符,管道命令经常与上面讲的过滤命令联合使用。DOS的管道功能是使一个程序或命令的标准输出用做另一个程序或命令的标准输入。如把DEBUG的输入命令写入文件aaa, 用type命令通过管道功能将aaa的内容传输给DEBUG, 在DEBUG执行期间不再从控制台索取命令参数, 从而提高了机器效率。命令为: C:\>type aaa|DEBUG >bbb。
例如,这是我以前看到的例子。命令dir|more使得当前目录列表在屏幕上逐屏显示。dir的输出是整个目录列表,它不出现在屏幕上而是由于符号“|”的规定,成为下一个命令more的输入,more命令则将其输入,more命令则将其输入一屏一屏地显示,成为命令行的输出。再如命令dir|find”hello”>file,其中 dir的输出是当前目录列表,不出现在屏幕上而是成为find命令的输入。find命令在输入文件中寻找指定字符串"hello"并输出包含这个字符串的行,由于输出重定向符号>的规定,最后的输出已存入文件file,不出现在屏幕上。命令dir|find"< dir >file则是将当前目录项中的子目录项寻找出来并存入文件file中。
三、 说明:
在这里非常感谢很久以前不知哪位大虾在网上提供的一些资料留下给我,我阅读后进行实际操作并对其进行了思考,有些例子有所类似或引用,在此表示感谢。今天在这里我重新想了管道和重定向,并把我所知道的都写了下来,和大家分享,希望对大家有用。从上可以看出重定向和管道经常在一起使用,我在这里主要介绍了管道和重定向基本知识和用法。由于在C语言中有system函数(如:
http://bbs.bc-cn.net/viewthread.php?tid=163777&extra=&page=10#288406),调用dos下的命令,所以学习一下dos命令也无妨,有时可能会用到。本文也是在昨天我发的一个帖子的情况下写下的,文字较多,也可锻炼耐心,呵呵。
本人知识匮乏,敬请原谅。下面讲一例,用C语言实现管道通信。(与上文无关,只是加深对管道的理解)
四、 管道通信——C语言描述(阅读的资料整理,供大家分享)
本例通过在父子进程之间建立一个管道,实现从一个子进程向一个父进程的数据传递,即管道通信。在C语言中,可以使用int pipe(int fd[2]);来创建管道:系统调用成功返回0,失败-1;数组fd[包括管道使用的两个文件描述符,fd[0]读取管道,fd[1]写入管道。创建管道后,用int fork();创建一个新的子程序:系统调用成功,在父进程中返回子进程的PID,在子进程中返回0;失败返回-1。
如果父进程希望从子进程中读取数据,那么它应该关闭fd[1],同时子进程关闭fd[0]。反之,父进程希望向子进程中发送数据,那么它应该关闭fd[0],同时子进程关闭fd[1]。因为文件描述符是父进程和子进程之间共享,所以要及时关闭不需要的管道那一端。
注意:(1).只有在管道的读端存在时向管道中写入数据才有意义,否则向管道中写入数据的进程会收到内核传来的SIFPIPE信号(通常broken pipe错误);(2).向管道中写入数据时,linux将不保证写入的原子性,管道缓冲区一有空闲区域,写入进程就会试图向管道写入数据。如果读进程不读取管道缓冲区中的数据,那么写操作将一直被阻塞。(3).父进程在运行时,他们的先后次序并不能保证,因此在这里为了保证父进程已经关闭了读描述符,可以在子进程中调用sleep函数。
具体代码如下:(最好在linux下运行)
4jk1mJzg.rar (962 Bytes) 谈谈重定向、管道与C


[此贴子已经被作者于2007-8-19 9:14:59编辑过]



pmLuriga.rar (937 Bytes) 谈谈重定向、管道与C

搜索更多相关主题的帖子: 管道 端口 LINUX 键盘 系统 
2007-08-19 07:28
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
得分:0 

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2007-08-19 09:10
百年不亮
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:789
专家分:0
注 册:2006-4-14
得分:0 
楼主勤奋啊,我早上起来时你已经写了这么多。

最后说一下,文中很多地方出现“DOS命令”,建议换成"Windows控制台命令",毕竟现在已经没有人用DOS了,担心有人会误解,以为是DOS系统的东西,其实windows和linux一样也提供命令行的用户界面,command或cmd和shell是一个概念吧。
2007-08-19 09:57
百年不亮
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:789
专家分:0
注 册:2006-4-14
得分:0 
windows控制台命令 大集合
winver---------检查Windows版本
wmimgmt.msc----打开windows管理体系结构(WMI)
wupdmgr--------windows更新程序
wscript--------windows脚本宿主设置
write----------写字板
winmsd---------系统信息
wiaacmgr-------扫描仪和照相机向导
winchat--------XP自带局域网聊天

mem.exe--------显示内存使用情况
Msconfig.exe---系统配置实用程序
mplayer2-------简易widnows media player
mspaint--------画图板
mstsc----------远程桌面连接
mplayer2-------媒体播放机
magnify--------放大镜实用程序
mmc------------打开控制台
mobsync--------同步命令

dxdiag---------检查DirectX信息
drwtsn32------ 系统医生
devmgmt.msc--- 设备管理器
dfrg.msc-------磁盘碎片整理程序
diskmgmt.msc---磁盘管理实用程序
dcomcnfg-------打开系统组件服务
ddeshare-------打开DDE共享设置
dvdplay--------DVD播放器

net stop messenger-----停止信使服务
net start messenger----开始信使服务
notepad--------打开记事本
nslookup-------网络管理的工具向导
ntbackup-------系统备份和还原
narrator-------屏幕“讲述人”
ntmsmgr.msc----移动存储管理器
ntmsoprq.msc---移动存储管理员操作请求
netstat -an----(TC)命令检查接口

syncapp--------创建一个公文包
sysedit--------系统配置编辑器
sigverif-------文件签名验证程序
sndrec32-------录音机
shrpubw--------创建共享文件夹
secpol.msc-----本地安全策略
syskey---------系统加密,一旦加密就不能解开,保护windows xp系统的双重密码
services.msc---本地服务设置
Sndvol32-------音量控制程序
sfc.exe--------系统文件检查器
sfc /scannow---windows文件保护

tsshutdn-------60秒倒计时关机命令
tourstart------xp简介(安装完成后出现的漫游xp程序)
taskmgr--------任务管理器

eventvwr-------事件查看器
eudcedit-------造字程序
explorer-------打开资源管理器

packager-------对象包装程序
perfmon.msc----计算机性能监测程序
progman--------程序管理器

regedit.exe----注册表
rsop.msc-------组策略结果集
regedt32-------注册表编辑器
rononce -p ----15秒关机
regsvr32 /u *.dll----停止dll文件运行
regsvr32 /u zipfldr.dll------取消ZIP支持

cmd.exe--------CMD命令提示符
chkdsk.exe-----Chkdsk磁盘检查
certmgr.msc----证书管理实用程序
calc-----------启动计算器
charmap--------启动字符映射表
cliconfg-------SQL SERVER 客户端网络实用程序
Clipbrd--------剪贴板查看器
conf-----------启动netmeeting
compmgmt.msc---计算机管理
cleanmgr-------垃圾整理
ciadv.msc------索引服务程序

osk------------打开屏幕键盘
odbcad32-------ODBC数据源管理器
oobe/msoobe /a----检查XP是否激活
lusrmgr.msc----本机用户和组
logoff---------注销命令

iexpress-------木马捆绑工具,系统自带

Nslookup-------IP地址侦测器

fsmgmt.msc-----共享文件夹管理器

utilman--------辅助工具管理器

gpedit.msc-----组策略
2007-08-19 09:59
lishizelibin
Rank: 2
等 级:论坛游民
帖 子:513
专家分:41
注 册:2007-5-10
得分:0 
呵呵,我比较喜欢研究一点dos,接近底层,很感谢你的指点

惟有学习不断的学习!
2007-08-19 10:00
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:0 
高人能看下这个吗 也是有关管道 重定向的 谢谢了

http://bbs.bc-cn.net/viewthread.php?tid=163033&star=at#
2007-08-19 12:55
lishizelibin
Rank: 2
等 级:论坛游民
帖 子:513
专家分:41
注 册:2007-5-10
得分:0 
你的涉及了vc编程,用了windows api
我也正在自学mfc,只能回去自己研究你的程序了

惟有学习不断的学习!
2007-08-19 13:44
lishizelibin
Rank: 2
等 级:论坛游民
帖 子:513
专家分:41
注 册:2007-5-10
得分:0 

我的沉了,也没人顶一下,我早晨5点多钟的辛苦呀

[此贴子已经被作者于2007-8-19 15:31:34编辑过]


惟有学习不断的学习!
2007-08-19 15:30
coachard
Rank: 3Rank: 3
等 级:新手上路
威 望:7
帖 子:1251
专家分:0
注 册:2007-8-12
得分:0 
已经拷下来了,呆会再看看

可以沉下去了~~~~~

偶学编程,也许本身就是一个错。。。
2007-08-19 15:33
lishizelibin
Rank: 2
等 级:论坛游民
帖 子:513
专家分:41
注 册:2007-5-10
得分:0 

悲惨!
节哀顺便吧。
下次我再写,得捧场呀,早知道我就睡觉了
害的我现在没精神


惟有学习不断的学习!
2007-08-19 15:37



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-163798-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.203694 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved