用有名管道文件实现两个进程之间的通信-创新互联
文章目录
新闻标题:用有名管道文件实现两个进程之间的通信-创新互联
网站URL:http://hbruida.cn/article/dgchod.html
- 1. 进程
- 2. 有名管道
- 3. 创建两个有名管道文件
- 4. 进程通信
- 4.1 进程mk_fifoa
- 4.1.1 打开两个有名管道文件并循环写入数据
- 4.2 进程mk_fifob
- 4.2.1 打开两个有名管道文件并循环写入数据
- 5. 运行结果
- 6. 完整代码
- 6.1 进程mk_fifoa
- 6.2 进程mk_fifob
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体
2. 有名管道- 匿名管道,由于没有名字,只能用于亲缘关系的进程间通信。为了克服这个缺点,提出了有名管道(FIFO),也叫命名管道、FIFO 文件。
- 有名管道(FIFO)不同于匿名管道之处在于它提供了一个路径名与之关联,以 FIFO 的文件形式存在于文件系统中,并且其打开方式与打开一个普通文件是一样的,这样即使与 FIFO 的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过 FIFO 相互通信,因此,通过 FIFO 不相关的进程也能交换数据。
- 一旦打开了 FIFO,就能在它上面使用与操作匿名管道和其他文件的系统调用一样的 I/O 系统调用了(如read()、write() 和 close())。与管道一样,FIFO 也有一个写入端和读取端,并且从管道中读取数据的顺序与写入的顺序是一样的。FIFO 的名称也由此而来:先入先出。
- 有名管道(FIFO) 和匿名管道(pipe)有一些特点是相同的,不一样的地方在于:
- FIFO 在文件系统中作为一个特殊文件存在,但 FIFO 中的内容却存放在内存中。
- 当使用 FIFO 的进程退出后,FIFO 文件将继续保存在文件系统中以便以后使用。
- FIFO 有名字,不相关的进程可以通过打开有名管道进行通信。
首先创建两个文件作为两个进程,分别取名为mk_fifoa和mk_fifob(注意,进程名不可与管道名相同)。
两个有名管道文件在一个文件内创建完即可。
利用mkfifo函数创建两个有名管道文件
int mkfifo(const char *pathname, mode_t mode);
- 作用:创建一个有名管道文件
- *pathname:有名管道文件的名称
- mode:文件权限
- 返回值:0 成功 -1 失败
//创建有名管道文件fifoa
int ret = -1;
ret = mkfifo("fifoa",0666);
//创建文件失败并且该文件不存在,若文件存在则正常执行
if(-1 == ret && errno != EEXIST)
{perror("mkfifoa error\r\n");
return -1;
}
printf("create fifoa OK!\r\n");
//创建有名管道文件fifob
ret = mkfifo("fifob",0666);
if(-1 == ret && errno != EEXIST)
{perror("mkfifob error\r\n");
return -1;
}
printf("create fifob OK!\r\n");
4. 进程通信
4.1 进程mk_fifoa
4.1.1 打开两个有名管道文件并循环写入数据利用IO所学的知识,使用文件IO打开
头文件:
#include#include#include#include
进程mk_fifoa先向管道文件fifoa内写入数据,然后由mk_fifob进程读出。完成进程mk_fifoa向进程mk_fifob通信
//打开文件fifoa,先把数据写入到fifoa中
int fdw = open("fifoa",O_WRONLY,0666);
if(-1 == fdw)
{perror("open errer\r\n");
return -1;
}
printf("open fifoa OK!\r\n");
//打开文件fifob,读取从进程mk_fifob中写入的数据
int fdr = open("fifob",O_RDONLY,0666);
if(-1 == fdr)
{perror("open error\r\n");
return -1;
}
printf("open fifob OK!\r\n");
//定义一个数组存放数据
char buf[BUF_SIZE] = {0};
//循环通信
while(1)
{//先写入
memset(buf,0,BUF_SIZE);
fgets(buf,BUF_SIZE,stdin);
write(fdw,buf,BUF_SIZE);
//读出
memset(buf,0,BUF_SIZE);
read(fdr,buf,BUF_SIZE);
printf("b ->a: %s",buf);
}
//关闭文件
close(fdw);
close(fdr);
4.2 进程mk_fifob
4.2.1 打开两个有名管道文件并循环写入数据进程mk_fifob刚好与进程mk_fifoa相反先读出在写入
进程mk_fifob再向管道文件fifob内写入数据,然后由mk_fifoa进程读出。完成进程mk_fifob向进程mk_fifoa通信。
//打开文件fifoa
int fdr = open("fifoa",O_RDONLY,0666);
if(-1 == fdr)
{perror("open error\r\n");
return -1;
}
printf("open fifoa OK!\r\n");
//打开文件fifob
int fdw = open("fifob",O_WRONLY,0666);
if(-1 == fdw)
{perror("open error");
return -1;
}
printf("open fifob OK!\r\n");
char buf[BUF_SIZE] = {0};
while(1)
{//先读
memset(buf,0,BUF_SIZE);
read(fdr,buf,BUF_SIZE);
printf("a ->b: %s",buf);
//写
memset(buf,0,BUF_SIZE);
fgets(buf,BUF_SIZE,stdin);
write(fdw,buf,BUF_SIZE);
}
close(fdr);
close(fdw);
5. 运行结果完成通信
#include#include#include#include#include#include#include#define BUF_SIZE 20
int main()
{//创建有名管道文件1
int ret = -1;
ret = mkfifo("fifoa",0666);
if(-1 == ret && errno != EEXIST)
{perror("mkfifoa error\r\n");
return -1;
}
printf("create fifoa OK!\r\n");
//创建有名管道文件2
ret = mkfifo("fifob",0666);
if(-1 == ret && errno != EEXIST)
{perror("mkfifob error\r\n");
return -1;
}
printf("create fifob OK!\r\n");
//打开文件fifoa
int fdw = open("fifoa",O_WRONLY,0666);
if(-1 == fdw)
{perror("open errer\r\n");
return -1;
}
printf("open fifoa OK!\r\n");
//打开文件fifob
int fdr = open("fifob",O_RDONLY,0666);
if(-1 == fdr)
{perror("open error\r\n");
return -1;
}
printf("open fifob OK!\r\n");
char buf[BUF_SIZE] = {0};
while(1)
{//先写入
memset(buf,0,BUF_SIZE);
fgets(buf,BUF_SIZE,stdin);
write(fdw,buf,BUF_SIZE);
//再读出
memset(buf,0,BUF_SIZE);
read(fdr,buf,BUF_SIZE);
printf("b ->a: %s",buf);
}
//关闭文件
close(fdw);
close(fdr);
return 0;
}
6.2 进程mk_fifob#include#include#include#include#include#include#include#define BUF_SIZE 20
int main()
{//打开文件fifoa
int fdr = open("fifoa",O_RDONLY,0666);
if(-1 == fdr)
{perror("open error\r\n");
return -1;
}
printf("open fifoa OK!\r\n");
//打开文件fifob
int fdw = open("fifob",O_WRONLY,0666);
if(-1 == fdw)
{perror("open error");
return -1;
}
printf("open fifob OK!\r\n");
char buf[BUF_SIZE] = {0};
while(1)
{//先读
memset(buf,0,BUF_SIZE);
read(fdr,buf,BUF_SIZE);
printf("a ->b: %s",buf);
//写
memset(buf,0,BUF_SIZE);
fgets(buf,BUF_SIZE,stdin);
write(fdw,buf,BUF_SIZE);
}
close(fdr);
close(fdw);
}
本片文章就此结束了,目前进程学习还在进行中,只是把比较有意思的写出来分享一下,如有错误还请指正!
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
新闻标题:用有名管道文件实现两个进程之间的通信-创新互联
网站URL:http://hbruida.cn/article/dgchod.html