利用管道实现进程间的单向通信

管道是进程间通信的最原始方式,今天我们利用管道的进程间通信,来实现简单的进程间单向通信
首先我们需要了解命名管道的一些特性命名管道的使用与创建
然后创建一个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接收到
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_40853073/article/details/83927375