Linuxc 进程间通信之有名管道

利用有名管道文件实现进程间通信,要求
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;
}  


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()
{
  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;
}

有名管道
匿名管道缺点
没有名字,只能用于具有亲缘关系的进程间通信
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”文件中的内容;


猜你喜欢

转载自blog.csdn.net/qq_37192076/article/details/80456861