当前位置: 首页 > news >正文

2.Lab One —— Util

sleep

运行效果

$ make qemu
...
init: starting sh
$ sleep 10
(nothing happens for a little while)
$

1.在Makefile中添加指令 $U/_sleep\,确保构建过程生成 _sleep 目标文件

2.创建user/sleep.c并编写,事实上就是调用了系统调用sleep

#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"int main(int argc ,char* argv[]){int n;if(argc != 2){fprintf(2,"Please enter a number\n");exit(1);}else{n = atoi(argv[1]); //atoi将字符串转变为数字//连接测试。。。sleep(n);exit(0);}
}

pingpong

运行效果

$ make qemu
...
init: starting sh
$ pingpong
4: received ping
3: received pong
$

1.在Makefile中添加指令 $U/_pingpong\,确保构建过程生成 _pingpong 目标文件

2.创建user/pingpong.c并编写,思路就是创建两个管道,fork一个子进程出来,一个管道给父进程,一个管道给子进程

不过如果管道的写端没有close的情况下,再管道中数据为空时对管道的读取会阻塞,因此不需要的管道描述符应该尽早关闭

#include "kernel/types.h"
#include "user/user.h"int main(int argc,char const *argv[]){int p1[2],p2[2]; //创建一个管道pipe(p1);pipe(p2);//创建管道,得到一个长度为2的数组//p1[0]表示读端,p1[1]表示写端int pid = fork(); //创建一个子进程if(pid == 0){ //子进程char buf;read(p1[0],&buf,1); //子进程读取一个字符printf("%d: received ping\n",getpid());write(p2[1],&buf,1); //子进程写入一个字符}else{ //父进程write(p1[1],"1",1); //父进程写入一个字符char buf;read(p2[0],&buf,1); //父进程读取一个字符printf("%d: received pong\n",getpid());wait(0); //等待子进程结束}exit(0);}

事实上,进到子进程里面可以把用不到的p1写和p2读关闭,即close(p1[1])和close(p2[0])

同理父进程也是一样,同时我这里wait放在最后并没有选择放在父进程read之前是利用了管道的阻塞性质,子进程没写之前读的话会阻塞,能实现一样的效果。


http://www.mrgr.cn/news/2476.html

相关文章:

  • Spring Boot
  • 如何免费获取乡镇级边界数据geoJson数据
  • 制作语音数据集: 爬取B站音视频+基于whisper语音识别标注
  • Python实现台阶问题/斐波纳挈
  • 已解决centos7 yum报错:cannot find a valid baseurl for repo:base/7/x86_64的解决方案
  • linux(ARM)常用MAC设置命令
  • TCP协议和UDP协议有什么区别?被攻击怎么处理?
  • GitHub | 记录上传到GitHub上面的md文件内容的图片无法显示的问题
  • 层次聚类算法原理及Python实现
  • AXI DMA内部的数据缓冲区
  • 虚拟化平台kvm架构 部署kvm虚拟化平台
  • 微信小程序的遍历和事件的简单案例
  • MySQL的数据类型
  • [word] 复杂文本如何仅全选word中的表格 (简单跟做即可)
  • MySQL复合查询
  • LDRA Testbed(TBrun)软件单元测试_实例讲解(局部静态变量)
  • 第四届机电一体化、自动化与智能控制国际学术会议(MAIC 2024)
  • 狄拉克函数 or 单位冲击函数
  • SQLALchemy ORM 的关联关系之 ORM 中的一对多/多对一
  • 机器学习笔记四-决策树