无名管道:主要是针对进程通信的(自己感觉它有很大的局限性)
特点:它不是一个文件系统,不能按名访问,这也是它和有名管道之间最大的区别。无名管道只是一个系统内存里面的东西。
半双工模式,数据只能流向一个方向(老师给我们举得例子就是水厂的水到居民用水,不可能倒着流对吧).
进程之间通信,但是只能是有亲缘关系的进程才能进行通信?比如父子进程:因为在父子进程中,子进程拷贝父进程的数据段,这让这两个进程在通信的时候就有了相连的关系。
下面我们来看一下:无名管道的创建,写入,读取,关闭(我用的的是Liunx系统CentOS)
这个函数是创建一个管道,将建成功函数的返回值是0,否则失败就是返回-1,并返回错误编号,errno.
在创建这个无名管道的时候,定义一个数组,大小为2,里面是用来存放句柄的(文件描述符).
无名管道有一个读端,pipefd[0]---------------------read(fd,buf,sizeof(buf));read函数呢是系统的读函数,将文件里面的东西读到buf里面,注意在使用无名管道进行进程之间通信的时候,我们需要调用的是系统的内核函数,不能调用库函数。
无名管道有一个写端,pipefd[1]---------------------write(fd,buf,sizeof(buf));write函数呢是系统的写函数,将buf里面的东西写到文件里面。
下一步就是关闭读端和写端。close(fd[0]),close(fd[1]);
我自己写了一个无名管道的例子:
这个程序是子进程写数据,父进程读数据,这样来实现进程之间的通信。运行结果是:
这是我写的一个很见到的程序,我也是一个新手,肯定有许多的不足之处,也请大家能提提好的建议。