管道在unix中是通过pipe函数来实现的。
头文件: #include <unistd.h>
函数定义:int pipe(int filedes[2]);
函数说明:
函数返回文件描述符,其中filedes[0]为管道的写入端,filedes[1]为管道的读取端
函数实例(一)pipe的简单使用:
#include <unistd.h>
#include <stdio.h>
int main( void )
{
int filedes[2];
char buf[80];
pid_t pid;
pipe( filedes );
if ( (pid=fork()) > 0 )
{
printf( "This is in the father process,here write a string to the pipe.\n" );
char s[] = "Hello world , this is write by pipe.\n";
write( filedes[1], s, sizeof(s) );
close( filedes[0] );
close( filedes[1] );
}
else
{
printf( "This is in the child process,here read a string from the pipe.\n" );
read( filedes[0], buf, sizeof(buf) );
printf( "%s\n", buf );
close( filedes[0] );
close( filedes[1] );
}
waitpid( pid, NULL, 0 );
return 0;
}
函数输出结果:
This is in the child process,here read a string from the pipe.
This is in the father process,here write a string to the pipe.
Hello world , this is write by pipe.
函数实例(二)使用dups文件重定向和父子进程的数据交互:
在shell命令下输入:
#cat file | grep "string"
grep 命令将使用cat命令的输出作为自己的输入,这个就是简单的用管道实现文件重定向的例子。
为了实现父子进程间的管道,我们需要将父进程的标准输出重定向到管道的输入端,将子进程的标准输入重定向到管道的标准输出端,这样父进程的输出就可以作为子进程的输入来使用了。
实现文件重定向:
只需要将管道的输入端(输出端)复制到文件描述符0(1)即可
dup2(fd1, 0); /* 复制fd1到文件描述符0中,更改标准输入为fd1,这里fd1应为管道的输入端 */
dup2(fd2, 1); /* 复制fd2到文件描述符1中,更改标准输出为fd2,这里fd2应为管道的输出端 */
dup2(fd3, 2); /* 复制fd3到文件描述符2中,更改标准错误输出为fd3 */
看一个例子:
#include <unistd.h>
#include <stdio.h>
int main()
{
int fildes[2];
pid_t pid;
int i, j;
char buf[256];
if (pipe(fildes) < 0 || (pid = fork()) < 0) /* 创建管道和子进程 */
{
fprintf(stderr, "error!n");
return 1;
}
if (pid == 0) {
close(fildes[1]);
dup2(fildes[0], 0);
close(fildes[0]);
gets(buf);
fprintf(stderr, "child:[%s]n", buf);
return 2;
}
close(fildes[0]);
dup2(fildes[1], 1);
close(fildes[1]);
puts("Hello!");
return 0;
}