1. 程式人生 > >利用管道實現程序間的單向通訊

利用管道實現程序間的單向通訊

管道是程序間通訊的最原始方式,今天我們利用管道的程序間通訊,來實現簡單的程序間單向通訊
首先我們需要了解命名管道的一些特性命名管道的使用與建立
然後建立一個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接收到
在這裡插入圖片描述