Linux命名管道的使用_Linux教程

      編輯Tag賺U幣
      Linux命名管道非常適合同一機器上兩個進程之間傳遞數據,其形式也是一個文件,但是讀取與寫入時遵循FIFO的原則。在使用命名管道時有兩種方式進行讀\寫:阻塞與非阻塞。

      使用命名管道很容易寫出生產者與消費者的程序。下面這個程序摘自《Linux程序設計(第3版)》

      producer.c

      #include <unistd.h>
      #include <stdlib.h>
      #include <stdio.h>
      #include <string.h>
      #include <fcntl.h>
      #include <limits.h>
      #include <sys/types.h>
      #include <sys/stat.h>

      #define FIFO_NAME "/tmp/my_fifo"
      #define BUFFER_SIZE PIPE_BUF
      #define TEN_MEG (1024 * 1024 * 10)

      int main()
      {
      int pipe_fd;
      int res;
      int open_mode = O_WRONLY;
      int bytes_sent = 0;
      char buffer[BUFFER_SIZE + 1];

      if(access(FIFO_NAME,F_OK) == -1){
      res = mkfifo(FIFO_NAME,0777);
      if(res != 0){
      fprintf(stderr,"Could not create fifo %s\n",FIFO_NAME);
      exit(EXIT_FAILURE);
      }
      }

      printf("Process %d opening FIFO O_WRONLY\n",getpid());
      pipe_fd = open(FIFO_NAME,open_mode);
      printf("Process %d result %d\n",getpid(),pipe_fd);

      if(pipe_fd != -1){
      while(bytes_sent < TEN_MEG){
      res = write(pipe_fd,buffer,BUFFER_SIZE);
      if(res == -1){
      fprintf(stderr,"Write error on pipe\n");
      exit(EXIT_FAILURE);
      }
      bytes_sent += res;
      }
      (void)close(pipe_fd);
      }
      else{
      exit(EXIT_FAILURE);
      }

      printf("Process %d finished\n",getpid());
      exit(EXIT_SUCCESS);
      }


      customer.c

      #include <unistd.h>
      #include <stdlib.h>
      #include <stdio.h>
      #include <string.h>
      #include <fcntl.h>
      #include <limits.h>
      #include <sys/types.h>
      #include <sys/stat.h>

      #define FIFO_NAME "/tmp/my_fifo"
      #define BUFFER_SIZE PIPE_BUF

      int main()
      {
      int pipe_fd;
      int res;

      int open_mode = O_RDONLY;
      char buffer[BUFFER_SIZE + 1];
      int bytes_read = 0;

      memset(buffer,'\0',sizeof(buffer));

      printf("Process %d opening FIFO O_RDONLY\n",getpid());
      pipe_fd = open(FIFO_NAME,open_mode);
      printf("Process %d result %d\n",getpid(),pipe_fd);

      if(pipe_fd != -1){
      do{
      res = read(pipe_fd,buffer,BUFFER_SIZE);
      bytes_read += res;
      }while(res > 0);
      (void)close(pipe_fd);
      }
      else{
      exit(EXIT_FAILURE);
      }

      printf("Process %d finished, %d bytes read\n",getpid(),bytes_read);
      exit(EXIT_SUCCESS);
      }

      來源:網絡搜集//所屬分類:Linux教程/更新時間:2011-12-08
      相關Linux教程