利用有名管道文件实现进程间通信,要求
1.写进程向有名管道文件写入10次“hello world”;
2.读进程读取有名管道文件中的内容,并依次打印。
源代码:
w.c
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main()
{
int i,fd;
mkfifo("ttfifo",0777);
if( (fd=open("ttfifo",O_WRONLY)) <0)
{
perror("open");
exit(1);
}
for (i=0;i<10;i++)
{
write(fd,"hello world\n",15);
}
close(fd);
return 0;
}
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main()
{
int i,fd;
mkfifo("ttfifo",0777);
if( (fd=open("ttfifo",O_WRONLY)) <0)
{
perror("open");
exit(1);
}
for (i=0;i<10;i++)
{
write(fd,"hello world\n",15);
}
close(fd);
return 0;
}
r.c
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main()
{
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main()
{
int fd;
char str[15];
if( (fd=open("ttfifo",O_RDONLY)) <0)
{
perror("open");
exit(1);
}
for (i=0;i<10;i++)
{
read (fd,str,15);
printf("%s\n",str);
}
close(fd);
return 0;
}
char str[15];
if( (fd=open("ttfifo",O_RDONLY)) <0)
{
perror("open");
exit(1);
}
for (i=0;i<10;i++)
{
read (fd,str,15);
printf("%s\n",str);
}
close(fd);
return 0;
}
有名管道
匿名管道缺点
没有名字,只能用于具有亲缘关系的进程间通信
FIFO(有名管道)
严格遵循先进先出的读写规则
有名字,FIFO的名字包含在系统的目录树结构中,支持无亲缘关系的进程按名字访问
类似匿名管道,在文件系统中不存在数据块,而是与一块内核缓冲区相关联
read和write操作也由pipe_read()和pipe_write() 实现
与匿名管道主要区别
FIFO索引节点出现在系统目录树上而不是pipefs特殊文件系统中
FIFO是一种双向通信管道,可以以读/写模式打开一个FIFO
1.有名管道的建立
基本函数
int mkfifo(const char * pathname, mode_t mode);
参数说明
pathname:创建的FIFO名字
mode:规定FIFO的读写权限
返回值
成功时返回0
失败时返回-1
若路径名存在,则返回EEXIST错误
说明
一般文件的I/O函数都可用于管道,如open(), close(), read(), write()等。
2.打开规则
为读操作而打开FIFO文件
若已有进程为写而打开该FIFO,则当前打开操作将成功返回
否则,可能阻塞直到有相应进程为写而打开该FIFO(当前打开操作未设置O_NONBLOCK标志)
或立即返回(当前打开操作设置O_NONBLOCK标志)
为写操作而打开FIFO文件
如果已经有进程为读而打开该FIFO,则当前打开操作将成功返回
否则,可能阻塞直到有相应进程为读而打开该FIFO(当前打开操作未设置O_NONBLOCK标志)
或者,返回ENXIO错误(当前打开操作设置O_NONBLOCK标志)
实例:
1,mkfifo testfifo 建立有名管道文件testfifo;
2,ls > testfifo 向有名管道文件写入”ls”命令显示的内容;
3,cat testfifo 用”cat”命令读取”testfifo”文件中的内容;