• 售前

  • 售后

热门帖子
入门百科

Linux管道通信【操作系统】利用pipe

[复制链接]
宁师我蚜 显示全部楼层 发表于 2022-1-12 13:34:22 |阅读模式 打印 上一主题 下一主题
实验内容:
编写一程序,建立一个管道。同时,父进程生成子进程 p1,p2,这两个子进程分别向管道中写入各自的字符串,父进程读出它们。

实验相关的系统调用:
(1)pipe的创建
         pipe(fd)
         fd[0]:pipe 的出口, 控制读操作     
         fd[1]:pipe 入口, 控制写操作
(2)pipe的读写
         写操作:write(fd[1],buf,size)buf:存放消息的空间,size :要写入的字符长度
         读操作:read(fd[0],buf,size)buf:存放消息的空间,size :要读出的字符长度
        :pipe读写存在互斥现象,读写不可同时进行,因此需要限制互斥操作
(3)int lockf(int files,int function,long size)
         作用:LOCKF主要是给文件上锁。当p2进程想要访问文件是或者给文件上锁,那么就要等待p1释放锁,此时p2处于睡眠状态但当p1解开锁时,p2就可以向管道中写入数据。其目的在于控制p1、p2同时向管道中写入数据。
         files是文件描述符;
         function是锁定和 解锁;1 表示锁定,0 表示解锁;
         size是锁定和解锁的字节数,若用 0,表示从文件的当前 位置到文件尾  
实验环境:ubantu_vim
实验代码:
  1. <code>#include<stdio.h>
  2. #include<stdlib.h>
  3. #include<unistd.h>
  4. #include<sys/wait.h>
  5. #include<sys/types.h>
  6. int main(){
  7.         int i,r;
  8.         int p1;
  9.         int p2;
  10.         int p3;
  11.         int fd[2];
  12.         char buf[50];
  13.         char s[50];
  14.         pipe(fd);                        //create a pipe
  15.         while((p1=fork())==-1); //create a child c1
  16.         if(p1==0){
  17.                 //child1 process
  18.             lockf(fd[1],1,0);      //ban others to write
  19.                 sprintf(buf,"messages from child process p1!\n");   //store char into buf
  20.                 printf("child process p1!\n");
  21.                 write(fd[1],buf,50);   //write buf into pipe
  22.                 sleep(5);              //let parent process read pipe
  23.                 lockf(fd[1],0,0);      //realse write
  24.                 exit(0);
  25.         }else{
  26.                 //parent process
  27.         while((p2=fork())==-1);//create a child c
  28.         if(p2==0){
  29.                         //child2 process
  30.                      lockf(fd[1],1,0);
  31.                         sprintf(buf,"messages from child process p2!\n");
  32.                         printf("child process p2!\n");
  33.                         write(fd[1],buf,50);
  34.                         sleep(5);
  35.                     lockf(fd[1],0,0);
  36.                         exit(0);            //c2 exit
  37.                 }else{
  38.                         //parent process
  39.                         while((p3=fork())==-1);
  40.                         if(p3==0){
  41.                                 //child process
  42.                                 lockf(fd[1],1,0);
  43.                                 sprintf(buf,"messages from child process p3!\n");
  44.                                 printf("child process p3!\n");
  45.                                 write(fd[1],buf,50);
  46.                                 sleep(5);
  47.                                 lockf(fd[1],0,0);
  48.                                 exit(0);
  49.                         }
  50.                                 wait(0);                //get the p1 exit message
  51.                                 if(r=read(fd[0],s,50)==-1)
  52.                                           printf("can't read pipe\n");
  53.                                 else printf("%s\n",s);
  54.                                 wait(0);
  55.                             if(r=read(fd[0],s,50)==-1)
  56.                                         printf("can't read pipe\n");
  57.                                 else printf("%s\n",s);
  58.                                 wait(0);
  59.                                 if(r=read(fd[0],s,50)==-1)
  60.                                         printf("can't read pipe\n");
  61.                                 else printf("%s\n",s);
  62.                                 exit(0);
  63.                 }
  64.         }
  65. }
复制代码
实验结果: 
源文件文件名:mulpipe.c
可执行文件名:mulpipe


来源:https://blog.caogenba.net/weixin_50400808/article/details/122424268
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作