继上一篇《进程通信之一使用WM_COPYDATA C++及C#实现》,进程通信之二将分为三篇文章讲解如何使用管道技术来完成进程通信功能。三篇文章目录如下:
1.《进程通信之二 管道技术第一篇 输入输出的重定向》
2.《进程通信之二 管道技术第二篇 匿名管道》
3.《进程通信之二 管道技术第三篇 命名管道》
本篇将介绍输入输出的重定向问题,先来看一个小小的实例,设有一个程序,该程序的输入输出为标准输入输出即从键盘上输入,输出到屏幕。现在要重定向输入法输出,使程序从文件中读取数据,处理后输出到文件。程序代码如下(称此程序为示例程序):
试给出几种不同的实现方法,另外如果没有程序代码,只有可执行文件,又应该如何做了?
实现方法一使用C语言的freopen()函数
函数功能:重定向控制台的输入输出
函数原型:
FILE *freopen(
const char *path,
const char *mode,
FILE *stream
);
函数说明:
第一个参数为文件指针(也可以用来指向标准输入输出)。
第二个参数为打开方式,"w"表示写,"r"表示读,"a"表示追加。其它设置可以参考MSDN。
第三个参数为FILE类型的指针,传入stdin表示标准输入,传入stdout表示标准输出。
这样用只要用简单一句freopen("infile.txt", "r", stdin);就可以使程序中的scanf()函数从文件中读取数据作为输入,同样freopen("outfile.txt", "w", stdout);可以使程序中的printf()函数将输出由标准输出改成输出到文件。现在有个问题,将程序的输入输出重定向到文件后,还能改回到标准输入输出吗?答案是可以的,对第一个参数传入"CON"这个字符串就可以了(linux为"/dev/console")。
下面就给出修改后的代码:
运行结果如下图所示:

可以看出该程序的输出输入已经完成了重定向。
实现方法2 使用C++的ifstream和ofstream类
有些场合使用类来完成输入输出的重定向任务会更加方便和习惯一些。所幸C++中就有ifstream和ofstream这二个类来帮助我们完成这一任务。这个二类的详细功能就不细说了。下面介绍下如何使用这二个类来重定向程序的输入输出(看的时候看慢点喔,不会会被很多类名给搞晕去^_^)。
这二个类可以以读的方式和写的方法打开一个文件(ifstream的首字母i就表示in,而ofstream的首字母o就表示out),在iosfwd文件中找到:
typedef basic_ifstream<char, char_traits<char> > ifstream;
typedef basic_ofstream<char, char_traits<char> > ofstream;
然后可以在fstream文件中找到basic_ifstream类是继承于basic_istream类,basic_ofstream类是继承于basic_ostream类。
然后再来看看C++中大家平常使用的cin和cout,可以在iostream文件中找到cin和cout的定义,这二个实际是istream类型和ostream类型的变量:
extern _CRTIMPistream cin;
extern _CRTIMPostream cout;
然后在iosfwd文件中可以找到:
typedef basic_istream<char, char_traits<char> > istream;
typedef basic_ostream<char, char_traits<char> > ostream;
明显cin和cout与ifstream类和ofstream类有着非常密切关系——cin是basic_istream类的变量,而ifstream则是basic_istream类的派生类。cout是basic_ostream类的变量,而ofstream则是basic_ostream类的派生类。
有了这个后,猜测很可能会有某个成员函数能将它们联系到一起,从而让cin和cout由标准输入输出重定向到从文件中读取,输出到文件。事实上在basic_istream类实际是虚继承于basic_ioso类,basic_ostream类实际是虚继承于basic_ios类。这二个类都有个rdbuf()成员函数,这个函数允许我们访问和修改类中一个类型为basic_streambuf类的成员变量。改动这个变量就能重定向输入输出。因此对cin和cout调用这个rdbuf()函数并传入ifstream和ofstream的rdbuf()就可以将控制台的标准输入输出改成从文件中读取和输出到文件。
OK,方法既然找到了,那下面就使用C++的方法来重定向输入输出:
运行结果如下图所示:

同样,这个程序也完成了输入输出的重定向。
上面的方法都是建立在修改源代码的基础上,如果只有程序文件即.exe文件那应该怎么做了?请参阅下一篇《进程通信之二 管道技术第二篇 匿名管道》
转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/7390350
如果觉得本文对您有帮助,请点击‘顶’支持一下,您的支持是我写作最大的动力,谢谢。
分享到:
相关推荐
然而,对于更复杂的多进程通信,可能需要考虑使用其他IPC机制,如命名管道(有名管道)、消息队列、共享内存或套接字等。 总的来说,Linux中的匿名管道是进程间通信的一个基础工具,虽然功能相对有限,但在特定场景...
在用户登录系统后,Shell是第一个被接触的界面,它负责解释用户输入的命令,并将其传递给系统内核执行。Shell不仅仅是一个命令行界面,它还提供了一种脚本语言编程环境,允许用户编写脚本来自动化复杂的任务。 ...
例如, `cat /etc/passwd | cut -d ":" -c 1` 将 passwd 文件中的每一行用 `:` 分隔,并将第一个字段输出。 sort 命令用于排序,语法为: `sort -t 分隔符 (+起始) (-结束) -nru`。例如, `cat /etc/passwd | sort`...
例如,`cat 是将`test01`的内容作为`cat`命令的标准输入,而`cat > test02`则将`cat`的输出重定向到`test02`。文件描述符重定向可以通过dup()和dup2()系统调用来复制或替换现有的文件描述符,以实现管道的建立。 **...
本章主要讨论的是Linux中的重定向管道(Redirection and Pipeline)这一核心概念,它是Linux命令行交互式操作的重要组成部分,允许用户灵活地控制输入输出以及进程间的通信。 首先,我们来看重定向(Redirection)...
2. **管道(Pipeline)**:管道允许将一个命令的输出作为另一个命令的输入,实现命令间的通信。在C语言中,我们使用`pipe()`函数创建一个管道,然后通过`fork()`创建子进程,分别连接到管道的读写端口,从而实现数据的...
7. 输入/输出重定向到进程(进程间通信): 使用`<()`和`()>`可以创建进程子句,将命令的输出作为另一个命令的输入,或者将命令作为另一个命令的输入。这在复杂的脚本中非常有用。 8. here文档(Here Document):...
- **创建管道**:使用`pipe()`创建一个管道用于父子进程间的通信。 - **创建子进程**:使用`fork()`创建子进程。 - **子进程操作**:子进程关闭管道写端,从管道读取加密消息并解密,然后将消息和当前时间写入日志...
第一部分 Linux 操作环境 第1章 Linux基础 1.1 登录Linux系统 1.2 Linx的shell 1.3 shell的一些基本命令 第2章 文本编辑 2.1 vi文本编辑器 2.2 emacs文本编辑器 第3章 Linux文件系统操作 3.1 文件类型 3.2 文件系统...
2. 实现进程间通信,例如在父进程中使用 dup2 函数重定向 stdout 到管道的输入端,而在子进程中使用 dup2 函数重定向 stdin 到管道的输出端。 在 UNIX 编程中,dup 和 dup2 函数的使用可以提高程序的灵活性和可扩展...
3. **管道(Pipes)**: 管道允许连接两个命令,使得第一个命令的输出成为第二个命令的输入。在C++中实现管道需要使用管道函数如`pipe()`,并结合多进程通信。 4. **子进程(Pid)**: 在shell中,用户输入的每个命令都会...
- 第一个子进程中,关闭管道的读端,确保只从写端输出;使用`dup2()`将标准输出重定向到管道的写端;使用`open()`打开`/etc/passwd`文件,并将其内容通过`dup2()`复制到标准输入;最后调用`execlp()`执行`grep`命令...
通过逐行读取用户输入,解析命令行,创建子进程执行命令,并处理输入输出重定向和管道,就能构建一个基本的Shell解释器。 在编程时,C语言是一个常见的选择,因为它是许多系统级编程的基础。熟悉Linux系统调用,如...
2. **文件I/O**:了解文件描述符、open()、read()、write()、close()等函数的基本用法,以及如何进行标准输入输出重定向和管道通信。 3. **信号处理**:学习如何使用signal()、sigaction()来注册信号处理函数,理解...
2. **重定向(Redirection)**:重定向允许我们改变命令的默认输入和输出,比如将输出重定向到文件,或将输入从文件读取。在编程时,我们可以使用`open()`、`dup()`和`close()`等系统调用来实现这一功能。 3. **...
3. 命令行参数:脚本可以接收命令行参数,例如`$1`、`$2`分别代表第一个和第二个参数。 二、控制结构 1. 条件语句:`if...fi`用于条件判断,如`if [ -f "$file" ]; then ... fi`检查文件是否存在。 2. 循环语句:`...
第十至第十三章则涉及进程环境,如环境变量、标准输入/输出、重定向和管道。这些章节将教会读者如何通过改变进程环境来实现更灵活的程序设计,以及如何利用这些机制构建复杂的命令行工具和脚本。 第十四至第十七章...
在“Unix Shell编程”的第三版中,可能会详细介绍Shell的高级特性,如管道(pipe)、进程间通信(IPC)、信号处理和数组变量。管道允许你连接多个命令,使前一个命令的输出成为后一个命令的输入。IPC(Inter-Process...
5. **第九章:输入输出重定向.doc** 输入输出重定向是UNIX shell的强项,文档可能会讲述如何改变默认的标准输入、输出和错误流,实现数据流的灵活控制,这对于编写脚本和批处理任务尤其重要。 6. **第五章:文件的...
这个压缩包包含了该书第一部分的第1到276页的中文版,共分为10个部分,方便读者分批下载和阅读。 在Unix环境中进行高级编程涉及的知识点广泛而深入,以下是一些主要的内容概览: 1. **Unix系统结构**:这部分通常...