操作系统实验6、管道通信

一、实验内容:使用管道通信方式实现两个子进程分别向父进程发送消息

二、程序代码:

#include<stdio.h>
#include<stdlib.h>

int main()
{
  int p1,p2,fd[2];//
  char buf[50],s[50];
  //该函数是建立管道文件,并将文件描述词通过数组返回
  //描述词 fd[0]的值:读端id; fd[1]的值:写端id
  pipe(fd);   //父进程建立管道
  while((p1=fork())==-1);   //创建子进程p1,直到成功
 //fork()函数:返回值为0,返回到新创建的子进程。
 //返回值>0,返回父进程或调用者。该值包含新创建的子进程的进程ID
 
  if(p1==0){   //执行子进程p1
    //对管道进行加、解锁
    //值为1,对fd[1]加锁,0解锁
    //第三个参数表示要加、解锁的连续字节数
    //从当前文件位置开始,整数向前,负数向后,计数不计入当前位置
    //0表示锁定当前位置到结尾区域
    lockf(fd[1],1,0);
    //将字符串写入缓冲区
    //成功返回字符数,失败返回-1
    sprintf(buf,"child process P1 is sending messages!\n");
    //将buf代表的缓冲区中 50字节的数据 写入fd[1]代表的写端
    //成功返回50,即字节数;失败返回-1
    write(fd[1],buf,50);
    //休眠
    sleep(5);
    lockf(fd[1],0,0);
    exit(0);   //关闭p1
  }else{  //执行父进程
    while((p2=fork())==-1);    //创建子进程p2,直到成功
    
    if(p2==0){   //执行子进程p2
      lockf(fd[1],1,0);
      //格式化字符串
      sprintf(buf,"child process P2 is sending messages!\n");
      write(fd[1],buf,50);
      sleep(5);
      lockf(fd[1],0,0);
      exit(0);    //关闭p2
    }else{   //执行父进程
      //wait()函数:回收僵尸进程
      //父进程调用wait函数可以回收子进程终止信息。该函数有三个功能:
      //阻塞等待子进程退出,回收子进程残留资源,获取子进程结束状态(退出原因)
      wait(0);    /*同步*/
      read(fd[0],buf,50);
      printf("%s\n",buf);
      wait(0);
      //从fd[0]代表的读端 读取50字节 保存在buf缓冲区
      //之后,文件的当前读写指针向后移动50字节
      read(fd[0],buf,50);
      printf("%s\n",buf);
      exit(0);   //结束父进程
       }
  }
}

三、实验结果
在这里插入图片描述

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值