管道:单向、先进先出,将一个进程的输出和另一个进程的输入连接在一起。从管道尾部写入数据,头部读出数据。通称所说的管道是无名管道;有名管道称作为FIFO;数据被一个进程读出后,将被从管道中删除,其它读进程将不能再读到这些数据。管道提供了简单的流控制机制,进程试图读空管道时,进程将阻塞。当然,管道已经满了,进程再试图向管道中写入数据,进程将阻塞。
分类:无名管道和有名管道,前者用于父子进程之间的通信,后者用于同一系统下的任意两个进程间的通信(如同读写文件一样)。
无名管道:由pipe()函数创建
int pipe(int filedis[2]); 成功返回 0 ; 失败返回 -1;
参数说明:filedis[2]是一个整形数组,存放由pipe()函数返回的两个文件描述符。
filedis[0]:用于读管道;
filedis[1]:用于写管道;
关闭管道:需要关闭两个文件描述,用close()函数即可;close(filedis[0]);
通常先创建一个管道,在用fork()函数创建一个子进程,该子进程会继承父进程所创建的管道。必须在系统调用fork()之前调用pipe(),否则子进程将不会继承文件描述符。
参考程序:
-
#include <unistd.h>
-
#include <sys/types.h>
-
#include <errno.h>
-
#include <stdio.h>
-
#include <stdlib.h>
-
-
int main()
-
{
-
int pipe_fd[2];
-
pid_t pid;
-
char buf_r[100];
-
char* p_wbuf;
-
int r_num;
-
-
memset(buf_r,0,sizeof(buf_r));
-
-
/*创建管道*/
-
if(pipe(pipe_fd)<0)
-
{
-
printf("pipe create error\n");
-
return -1;
-
}
-
-
/*创建子进程*/
-
if((pid=fork())==0) //子进程 OR 父进程?
-
{
-
printf("\n");
-
close(pipe_fd[1]);
-
sleep(2); /*为什么要睡眠*/
-
if((r_num=read(pipe_fd[0],buf_r,100))>0)
-
{
-
printf( "%d numbers read from the pipe is %s\n",r_num,buf_r);
-
}
-
close(pipe_fd[0]);
-
exit(0);
-
}
-
else if(pid>0)
-
{
-
close(pipe_fd[0]);
-
if(write(pipe_fd[1],"Hello",5)!=-1)
-
printf("parent write1 Hello!\n");
-
if(write(pipe_fd[1]," Pipe",5)!=-1)
-
printf("parent write2 Pipe!\n");
-
close(pipe_fd[1]);
-
sleep(3);
-
waitpid(pid,NULL,0); /*等待子进程结束*/
-
exit(0);
-
}
-
return 0;
-
}
阅读(1584) | 评论(0) | 转发(0) |