透过实例看有名管道与无名管道


    ***无名管道
    创建:int pipe(int fd[2])   
    其中fd[0]用来读、fd[1]用来写。
    所以一般在父进程中将fd[0]进行close  在子进程中将fd[1]进行close。
    
    管道是单向通道,只能在一端进行数据的写入,另一端进行数据的读出,不能复用。
    
    由于管道属于队列,所以管道中的东西在读取之后就会被删除,
    当管道内已经写满时,再次写入会阻塞,直至读端将数据进行读出;
    相反,读端如果发现管道内无数据时,就会阻塞住,直至写端将数据写入。
    
    局限:只能在实现父子进程(有亲缘关系的进程)之间的通信
    
    实例:将process_inter放进管道内,进行进程间的通信。
    

#include "unistd.h"
        #include "stdio.h"
        #include "sys/types.h"
        #include "stdlib.h"
        int main()
        {
          pid_t pid;
          int fd[2];
          int ret;
          int process_inter=0;
          ret=pipe(fd);
          if(ret < 0)
          {
            printf("creat pipe failure\n");
            return -1;
          }
          printf("creat pipe sucess\n");
          pid = fork();
          if(pid ==0)//child process code   second
          {
            int i=0;
            read(fd[0],&process_inter,1);//if pipe empty   sleep
           
            while(process_inter==0);
            for(i=0;i<5;i++)
            {
            
             printf("this is child process  i=%d \n",i);
             usleep(100);
            }
            
          }
          if(pid >0)//parent process code   first
          {
            int i=0;
            process_inter=0;
            for(i=0;i<5;i++)
            {
                usleep(100);
                printf("father pid i=%d \n",i);
            }
            process_inter++;
            write(fd[1],&process_inter,1);
            
          }
          
          return 0;
           
        }

    
    ***有名管道(有inode号)
    mkfifo:用来创建文件节点,并未在内核中创建管道,但是不占磁盘空间。
    当使用open函数打开文件时才会在内核空间中创建管道。
    注:管道文件只有inode号,不占磁盘块空间,和套接字、字符设备文件、块设备文件一样普通文件和符号链接文件及目录文件,不仅有inode号,还占磁盘块空间。
    
    实例:使用mkfifo创建有名管道,实现进程间的通信:
    
    /*  fork.c   创建有名管道  */
  

  #include "unistd.h"
    #include "stdio.h"
    #include "sys/types.h"
    #include "stdlib.h"
    int main()
    {
      pid_t pid;
      int fd[2];
      int ret;
      int process_inter=0;
      ret=pipe(fd);
      if(ret < 0)
      {
        printf("creat pipe failure\n");
        return -1;
      }
      printf("creat pipe sucess\n");
      pid = fork();
      if(pid ==0)//child process code   second
      {
        int i=0;
        read(fd[0],&process_inter,1);//if pipe empty   sleep
       
        while(process_inter==0);
        for(i=0;i<5;i++)
        {
        
         printf("this is child process  i=%d \n",i);
         usleep(100);
        }
        
      }
      if(pid >0)//parent process code   first
      {
        int i=0;
        process_inter=0;
        for(i=0;i<5;i++)
        {
            usleep(100);
            printf("father pid i=%d \n",i);
        }
        process_inter++;
        write(fd[1],&process_inter,1);
        
      }
      
      return 0;
       
    }


    
    /*  first.c  第一个进程,并进行管道内数据的写入 */
    

#include "unistd.h"
    #include "stdio.h"
    #include <stdio.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>           /* Definition of AT_* constants */
    #include <sys/stat.h>
    int main()
    {
     int fd;
     int i;
     char process_inter=0;
     fd=open("./myfifo",O_WRONLY);
     if(fd <0)
     {
       printf("open myfifo failure\n");
       return -1;
     }
     printf("open myfifo sucess\n");

     for(i=0;i<5;i++)
     {
       printf("this is first process i=%d\n",i);
       usleep(100);
     }
     process_inter=1;
     sleep(5);
     write(fd,&process_inter,1);
     while(1);
     return 0;  
    }

    /* second.c   第二个进程 ,实现数据的读入*/
        

#include "unistd.h"
        #include "stdio.h"
        #include <stdio.h>
        #include <string.h>
        #include <sys/types.h>
        #include <sys/stat.h>
        #include <fcntl.h>           /* Definition of AT_* constants */
        #include <sys/stat.h>
        int main()
        {
         int fd;
         int i;
         int process_inter=0;
         fd=open("./myfifo",O_RDONLY);
         if(fd <0)
         {
           printf("open myfifo failure\n");
           return -1;
         }
         printf("open myfifo sucess\n");

         read(fd,&process_inter,1);
         while(process_inter == 0);

         for(i=0;i<5;i++)
         {
           printf("this is second process i=%d\n",i);
           usleep(100);
         }
         while(1);
         return 0;  
        }

    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

猜你喜欢

转载自blog.csdn.net/qq_41464499/article/details/88175992
今日推荐