- A+
Linux管道读写及重定向的一个简易代码
先给出子进程执行的test程序(需先编译)
// test.cpp
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
if (argc < 2)
{
cerr << "argc err" << endl;
}
while (--argc)
{
cout << *(++argv) << endl; // 输出传递进来的参数
}
return 0;
}
下面给出主程序文件
// myduptest.cpp
#include <unistd.h>
#include <string>
#include <iostream>
using namespace std;
// 管道流向,子进程>>>>>>>>>父进程
// 子进程往管道写数据,父进程读取数据
int main()
{
int fd[2];
pid_t pid;
pipe(fd); // 建立管道
if ((pid=fork()) == -1)
{
cerr << "fork failed" << endl;
exit(1);
}
if (pid == 0)
{
close(fd[0]); // 子进程关闭读
dup2(fd[1], STDOUT_FILENO); // 重定向输出到写管道
char * argin[] = {"/home/cailizhong/f72/linuxSock/linuNetworkProgram/test", "hello kitty", "ha ha", NULL};
execvp(argin[0], argin); // 执行程序test,并传递参数给test程序
}
else
{
close(fd[1]); // 父进程关闭写
dup2(fd[0], STDIN_FILENO); // 重定向读到读管道
string ss;
while (getline(cin, ss))
{
cout << "nbytes: " << ss.size() << endl;
cout << "Received string: " << ss << endl;
cout << "------------------------------------" << endl;
}
}
return 0;
}
下面是主程序执行结果
nbytes: 11
Received string: hello kitty
------------------------------------
nbytes: 5
Received string: ha ha
------------------------------------