Linux高级编程基础——进程间通信之有名管道

进程间通信之有名管道

/*

利用有名管道文件实现进程间通信,要求

  1. 写进程向有名管道文件写入10次“hello world”;
  2. 读进程读取有名管道文件中的内容,并依次打印。
    */

/* 这个实验有三个小部分,要分开写,分别是管道的创建 ,写入,读取,*/

//这个是创建

#include
#include
#include      
#include
#include
#include
#include
#include
#define BUFES PIPE_BUF

int main()
{
 if (mkfifo("testfifo1",777) < 0)  //创建一个有名管道 ,并且给他赋予所有权限
  {
    perror("mkfifo:");
  }
else
  printf ("mkfifo testfifo1 ok \n");     
 return 0;
}

//这个是写入,

在执行这个程序之前需要进入root用户,在执行后另外打开一个终端,执行读取操作

#include
#include
#include
#include
#include
#include
#include
#include
#define BUFES PIPE_BUF

int main()
{
       
       
       
       int fd;
       int n, i;
       if( (fd=open("testfifo2",O_WRONLY)) <0)  //打开刚才创建的那个有名管道
        {
                perror("open");
                exit(1);
        }
       for(i = 0; i <= 10; i++)
          {
              if ( write( fd , "hello world \n",13)<0 )  //通过循环往有名管道里面写入十次 “hello world”
                {
                        perror("write");
	                exit(1);
                }
              
          }
         printf ("写入成功");
         close (fd);      //关闭这个管道
    exit (0);
}

//这个是读取

#include
#include
#include
#include
#include
#include
#include
#include
#define BUFES PIPE_BUF

int main()
{
 int fd;
 int len;
 char buf[BUFES];
 fd=open("testfifo2",O_RDONLY);  //以读的方式打开这个有名管道
 while((len=read(fd,buf,BUFES))>0) //从中读取数据
     printf("read: %s",buf);   //打印读到的数据
 close(fd);         //关闭这个管道
 return 0;
}
 

/*

  1. 管道是先写还是先读?
    先写入,管道里面才有东西,才能读取出来 先写入,管道里面才有东西,才能读取出来
  2. 有名管道用在那个地方?
    既可以用在父子进程之间,也可以用在两个独立的进程之间 既可以用在父子进程之间,也可以用在两个独立的进程之间
    */

你可能感兴趣的:(Linux)