管道是进程间通信的最原始方式,今天我们利用管道的进程间通信,来实现简单的进程间单向通信
首先我们需要了解命名管道的一些特性命名管道的使用与创建
然后创建一个fifo_c的文件来实现输入数据和发送数据
/*这是一个命名管道的实现,往命名管道中写入数据,并且发送给另一个进程
* 1. 创建一个命名管道
* int mkfifo(const char*pathname,mod_t mod);
* pathname:管道的文件路径名字
* mod:管道文件的权限
* 成功返回0, 失败返回-1
* 2.打开管道open
* 3.往管道中写入数据
* 4.关闭管道文件close
*/
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<fcntl.h>//文件操作的头文件
int main()
{
umask(0);
//为了防止因为管道文件存在,创建失败
//unlink("./test.fifo")-----删除文件
//1.创建命名管道
if(mkfifo("./test.fifo",0664)<0){
if(errno==EEXIST){
//文件存在
}
else{
perror("mkfifo error");
return -1;
}
}
//2.打开管道文件
//打开特性:如果以只读打开命名管道,那么open函数将阻塞等待,直到有其他进程以写的方式打开这个命名管道
//只写反之亦然
//如果文件以读写的方式发开,则不会阻塞
int fd=open("./test.fifo",O_WRONLY);//以只写的方式打开管道
if(fd<0){//根据打开管道的返回值,来判断是否成功打开
perror("open fifo error");
return -1;
}
printf("open fifo file success!!read start!\n");
while(1){
char buff[1024]={0};
scanf("%s",buff);//从键盘输入数据
write(fd,buff,strlen(buff));
sleep(1);
}
close(fd);
return 0;
}
创建一个fifo来接收打印数据
/*这是一个命名管道的实现,从命名管道中读取数据打印
* 1. 创建一个命名管道
* int mkfifo(const char*pathname,mod_t mod);
* pathname:管道的文件路径名字
* mod:管道文件的权限
* 成功返回0, 失败返回-1
* 2.打开管道open
* 3.从管道中读取数据
* 4.关闭管道文件close
*/
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<fcntl.h>//文件操作的头文件
int main()
{
umask(0);
//为了防止因为管道文件存在,创建失败
//unlink("./test.fifo")-----删除文件
//1.创建命名管道
if(mkfifo("./test.fifo",0664)<0){
if(errno==EEXIST){
//文件存在
}
else{
perror("mkfifo error");
return -1;
}
}
//2.打开管道文件
//打开特性:如果以只读打开命名管道,那么open函数将阻塞等待,直到有其他进程以写的方式打开这个命名管道
//只写反之亦然
//
//如果文件以读写的方式发开,则不会阻塞
int fd=open("./test.fifo",O_RDONLY);
if(fd<0){
perror("open fifo error");
return -1;
}
printf("open fifo file success!!read start!\n");
while(1){
char buff[1024]={0};
int ret=read(fd,buff,1023);
if(ret>0){//如果读取成功打印
printf("client say[%s] \n",buff);
}else if(ret==0){//如果所有写端被关闭,那么读取时返回0;
printf("all write point is close\n");
sleep(1);
}
}
close(fd);
return 0;
}
执行,fifo_c和fifo两个进程,给fifo_c输入"你好啊! ! !"
fifo接收到