管道的目的
数据传输:
将 一个进程的数据传递给另一个进程
进程通信
多个进程共享相同的资源
通知事件
一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止 时要通知父进程)
进程控制
有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另 一个进程的所有陷入和异常,并能够及时知道它的状态改变
匿名管道
头文件<unistd.h>
函数 int pipe(int fd[2])
作用创建一个匿名管道
fd是一个文件描述符数组,为一个出参,成功返回0,失败返回错误代码
f[0]是读端,f[1]为写端
例子
创建一个管道,打印写端的文件符和读端的文件符
#include <stdio.h>
#include <unistd.h>
int main()
{
int fd[2];
int ret = pipe(fd);
if(ret < 0)
{
perror("pipe");
return 0;
}
printf("fd[0]:%d\n", fd[0]);
printf("fd[1]:%d\n", fd[1]);
while(1)
{
}
return 0;
}
~
例子:从键盘读取数据,写入管道,读取管道,写到屏幕
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main( void )
{
int fds[2];
char buf[100];
int len;
if ( pipe(fds) == -1 )
perror("make pipe"),exit(1);
// read from stdin
while ( fgets(buf, 100, stdin) ) {
len = strlen(buf);
// write into pipe
if ( write(fds[1], buf, len) != len ) {
perror("write to pipe");
break;
}
memset(buf, 0x00, sizeof(buf));
// read from pipe
if ( (len=read(fds[0], buf, 100)) == -1 ) {
perror("read from pipe");
break;
}
// write to stdout
if ( write(1, buf, len) != len ) {
perror("write to stdout");
break;
}
}
}