(程序部分内容都来自百度、或友善、或博创、或某些未知的地方~~~~~也有自己加的地方~~~~~)
进程间通信方式之有名管道
1:有名管道
无名管道没有名字,简单的同时限定了管道只能使用在亲缘进程中使用。有名管道可以为管道文件添加实名,实现了无亲缘关系间的通信。这样有名管道的使用就像一个先入先出队列(FIFO)一样而管道文件也会根据建立是指定的位置而被建立。只要知道该文件路径,就可以进行访问。fifo指代(fist in, fist out),即按照先进先出的工作。
2:进程间有名管道通信
程序简述:
由于使用无名管道时如果两个程序无法得到管道文件的描述符(fd[])就无法在两个进程间进行管道通信。可是在使用两个分立程序时由于不是父子进程的关系没办法在管道建立时把文件描述符继承给另一个文件,而且如果使用共享内存等方式传递这个文件描述符的话会出现“增加内存的占用”和“编程难度提高”“资源浪费”等问题,因此在此引入了有名管道这一概念。其实这两种管道建立好之后用法是相同的。只要open的文件是使用的管道,就会返回描述符。
重点掌握函数:
unlink();
mkfifo();
示列程序:
#include <stdio.h>//c标准头文件
#include <unistd.h>//unix类系统定义符号常量的头文件
#include <stdlib.h>//标准链接库
#include <fcntl.h>//各种宏定义
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/types.h>
int main(void)
{
char buf[80]; //数据暂存
int fd; //文件描述符存储变量
unlink( "zieckey_fifo" ); //删除文件管zieckey_fifo内的所有内容,只要防 //止有同名文件(上次运行未删除的管道文件,也可设置具体的位置)
mkfifo( "zieckey_fifo", 0777 ); //创建实名管道,文件名zieckey_fifo,限 //权777
if ( fork() > 0 ) //建立进程
{
char s[] = "Hello!\n"; //所要传输的数据
fd = open( "zieckey_fifo", O_WRONLY );//打开管道,返回描述符。打开方式 //为“只写”。
write( fd, s, sizeof(s) ); //写管道数据(如果无数据就等待数 //据)
//close( fd );
}
else
{
fd = open( "zieckey_fifo", O_RDONLY );//打开管道,返回描述符。打开方式 //为“只读”。
read( fd, buf, sizeof(buf) ); //读管道数据。
printf("The message from the pipe is:%s\n", buf );//输出管道数据。
//close( fd );
}
return 0;
}