有名管道
有名管道的特点:
(1):也是一个半双工的通信模式
(2):可以实现互不相关的两个进程的通信,也可以实现有亲缘关系的两个进程的通信。
(3):该管道可以通过路径名来指出,在文件系统中是可见的。
(4):FIFO严格地遵循先进先出规则,不支持lseek()等文件定位操作。
有名管道的读写进程阻塞情况:
(1):缺省情况下,如果当前FIFO内没有数据,读进程将一直阻塞到有数据写入或是FIFO写端关闭。
(2):只要FIFO有空间,数据可以被写入。若空间不足,写进程会阻塞。
有名管道的创建:
创建函数:mkfifo("./管道文件名“,文件权限)函数,成功:返回0,失败:返回 -1。
打开创建的管道文件名:open("管道文件名",文件权限),成功:返回0,失败:返回-1。
进行读写操作:read(),write();
关闭管道文件:close()函数;
实现不同进程间的相互通信的完整代码。
写进程程序代码:
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<stdlib.h>
#include<errno.h>
#include<sys/stat.h>
#include<fcntl.h>
int main()
{
pid_t pid = fork();
if(pid < 0)
{
perror("fork error!");
return -1;
}
if(pid > 0)
{
int ret = mkfifo("./text2.fifo",0666);
if(ret < 0&&EEXIST != errno)
{
perror("mkfifo error!");
return -1;
}
int fd = open("text2.fifo",O_RDWR);
if(fd < 0)
{
perror("open error!");
return -1;
}
else
{
char buf[100] = {0};
while(1)
{
memset(buf,0,sizeof(buf));
printf("fifo_w发消息:\n");
gets(buf);
int ret1 = write(fd,buf,sizeof(buf));
if(ret1 < 0)
{
perror("write error!");
close(fd);
return -1;
}
}
}
close(fd);
}
else
{
int ret2 = mkfifo("./text3.fifo",0666);
if(ret2 < 0 && EEXIST != errno)
{
perror("mkfifo1 error!");
return -1;
}
int fd1 = open ("text3.fifo",O_RDWR);
if(fd1 < 0)
{
perror("open1 error!");
return -1;
}
else
{
char buf1[100] = {0};
while(1)
{
memset(buf1,0,sizeof(buf1));
int ret3 = read(fd1,buf1,sizeof(buf1));
if(ret3 < 0)
{
perror("read1 error!");
close(fd1);
}
else
{
printf("收到fifo_r的信息:%s\n",buf1);
}
}
}
close(fd1);
}
return 0;
}
读进程程序代码:
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<stdlib.h>
#include<errno.h>
#include<sys/stat.h>
#include<fcntl.h>
int main()
{
pid_t pid = fork();
if(pid < 0)
{
perror("fork error!");
return -1;
}
if(pid > 0)
{
int ret = mkfifo("./text2.fifo",0666);
if(ret < 0 && EEXIST != errno)
{
perror("mkfifo error!");
return -1;
}
int fd = open("text2.fifo",O_RDWR);
if( fd < 0)
{
perror("open error!");
return -1;
}
else
{
char buf[100] = {0};
while(1)
{
memset(buf,0,sizeof(buf));
int ret1 = read(fd,buf,sizeof(buf));
if(ret1 < 0)
{
perror("read error!");
close(fd);
return -1;
}
else
{
printf("收到fifo_w信息:%s\n",buf);
}
}
}
close(fd);
}
else
{
int ret2 = mkfifo("./text3.fifo",0666);
if(ret2 < 0&&EEXIST != errno)
{
perror("mkfifo1 error!");
return -1;
}
int fd1 = open("text3.fifo",O_RDWR);
if(fd1 < 0)
{
perror("open1 error!");
return -1;
}
else
{
char buf1[100] = {0};
while(1)
{
memset(buf1,0,sizeof(buf1));
printf("fifo_r发消息:\n");
gets(buf1);
int ret3 = write(fd1,buf1,sizeof(buf1));
if(ret3 < 0)
{
perror("write1 error!");
close(fd1);
return -1;
}
}
}
close(fd1);
}
return 0;
}
程序结果: