操作系统导论-课后作业-ch5

关于man的使用

man  系统参考手册
man n name   在系统手册第n章查看name

1.

代码:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>int main() {int x = 100;int rc = fork();if (rc == -1) {fprintf(stderr, "fork failed\n");} else if (rc == 0) {printf("child pid: x = %d\n", x);} else {wait(NULL);}return 0;
}

输出:
在这里插入图片描述
子进程会保持和父进程一样的值100,当子进程和父进程都改变x的值时,变量会各自单独保持一份互不影响,相互隔离。

2.

#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>int main(int argc, char* argv[]) {int fd = open("./tmp.txt", O_CREAT | O_APPEND | O_RDWR, S_IRWXU);int rc = fork();if (rc == -1) {fprintf(stderr, "fork failed\n");} else if (rc == 0) {int i;for (i = 0; i < atoi(argv[1]); i++) write(fd, "child\n", 6);} else {int i;for (i = 0; i < atoi(argv[1]); i++) write(fd, "parent\n", 7);wait(NULL);close(fd);}return 0;
}

结果如下:
在这里插入图片描述
1次并没有发现并发问题,试过1000次也没什么问题

3.

可以使用vfork来做到等待子进程结束,具体可见系统手册:
在这里插入图片描述

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>int main() {int rc = vfork();if (rc == -1) {fprintf(stderr, "fork failed\n");} else if (rc == 0) {printf("hello\n");} else {printf("goodbye\n");}return 0;
}

另一种实现方式:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>int flag = 0;int main() {int rc = vfork();if (rc == -1) {fprintf(stderr, "fork failed\n");} else if (rc == 0) {printf("hello\n");flag = 1;exit(1);} else {while(flag == 0);printf("goodbye\n");wait(NULL);}return 0;
}

最终输出如下:
在这里插入图片描述

4.

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>int main() {int i; for (i = 1; i <= 6; ++i) {int rc = fork();if (rc == -1) {fprintf(stderr, "fork failed\n");exit(1);} else if (rc == 0) {char* path = "/bin/ls";char* pro = "ls";char* target = ".";char* ev[] = {pro, target, NULL};switch (i){case 1:execl(path, pro, target, NULL);break;case 2:execle(path, pro, target, NULL);break;case 3:execlp(pro, pro, target, NULL);break;case 4:execv(path, ev);break;case 5:execvp(pro, ev);break;case 6:execvpe(pro, ev);break;default:break;}} else {wait(NULL);}}return 0;
}

结果如下:
在这里插入图片描述

5.

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>int main() {int rc = vfork();if (rc == -1) {fprintf(stderr, "fork failed\n");} else if (rc == 0) {wait(NULL);printf("child pid is %d\n", getpid());exit(1);} else {int result = wait(NULL);printf("the return value is %d\n", result);exit(1);}return 0;
}

在这里插入图片描述
从上图中可见,wait返回的是子进程的进程号,而子进程中使用wait并不会发生什么,它会等待子进程自己的子进程结束。

6.

在这里插入图片描述
同样是返回pid,但是waitpid传入的参数不同,需要传入子进程的id、状态参数以及额外的选项。

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>int main() {int rc = vfork();if (rc == -1) {fprintf(stderr, "fork failed\n");} else if (rc == 0) {printf("child pid is %d\n", getpid());exit(1);} else {int result = waitpid(rc, NULL, 0);printf("the return value is %d\n", result);exit(1);}return 0;
}

结果如下图所示:
在这里插入图片描述

7.

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <errno.h>
#include <string.h>int main() {int rc = fork();if (rc == -1) {fprintf(stderr, "fork failed\n");} else if (rc == 0) {close(STDOUT_FILENO);int res = printf("output something\n");fprintf(stderr, "%d\n", res);res = fflush(stdout);fprintf(stderr, "%d %s\n", res, strerror(errno));} else {wait(NULL);}return 0;
}

在这里插入图片描述
会把数据先写在缓存块内,具体可参考:在关闭stdout之后调用printf会发生什么?

8.

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>int main() {int fds[2];pipe(fds);int rc = fork();if (rc == -1) {fprintf(stderr, "fork failed\n");} else if (rc == 0) {close(STDOUT_FILENO);close(fds[1]);dup(fds[0]);close(fds[0]);}rc = fork();if (rc == -1) {fprintf(stderr, "fork failed\n");} else if (rc == 0) {close(STDIN_FILENO);close(fds[1]);dup(fds[1]);close(fds[1]);printf("hello\n");}close(fds[1]);close(fds[0]);wait(NULL);return 0;
}

结果如下图所示:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/624503.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

16位单片机单片机S1C17153

16位单片机单片机 .16KB ROM / 2KB内存 * S1C17653对于程序开发很有用。 .产生具有内置振荡器的操作时钟。 - OSC3B振荡器电路&#xff1a;2MHz/1MHz/500kHz&#xff08;类型&#xff09;内部振荡器电路 -OSC1无振荡器电路&#xff1a;32.768 kHz&#xff08;类型&#xf…

SSL证书与HTTPS的关系

SSL证书是一种数字证书&#xff0c;由权威的证书颁发机构颁发。它包含了一个公钥和有关证书所有者的一些信息&#xff0c;如名称、组织、邮箱等。SSL证书的主要作用是实现数据加密和身份验证&#xff0c;确保数据在传输过程中的安全性和完整性。 HTTPS是一种基于HTTP协议的安全…

R语言【技巧】——判断自定义函数的传参内容是否符合要求

1. 利用 if 条件判断&#xff0c;stop 语句报错 比如 对一个应该传入数值型&#xff0c;数值为 0 或 1 的参数&#xff1a; if(add.strat<0 | add.strat>1){stop("add.strat represents the fraction of pseudoabsences that aresampled environmentally stratifi…

༺༽༾ཊ—游戏-01_2D-开发—ཏ༿༼༻

首先利用安装好的Unity Hub创建一个unity 2D&#xff08;URP渲染管线&#xff09;项目 选择个人喜欢的操作格局&#xff08;这里采用2 by 3&#xff09; 在Project项目管理中将双栏改为单栏模式&#xff08;个人喜好&#xff09; 找到首选项&#xff08;Preferences&#xff09…

Django教程第4章 | Web开发实战-三种验证码实现

系列&#xff1a;Django学习教程 验证码的存在是为了防止系统被暴力破解攻击&#xff0c;几乎每个系统都有验证码。下面将介绍三种生成验证码方式。 您可以根据你自己的需要进行学习。 手动生成验证码 安装绘图依赖&#xff0c;利用的是画图模块 PIL 以及随机模块 random 在后…

鸿蒙开发-UI-布局-线性布局

鸿蒙开发-序言 鸿蒙开发-工具 鸿蒙开发-初体验 鸿蒙开发-运行机制 鸿蒙开发-运行机制-Stage模型 鸿蒙开发-UI 鸿蒙开发-UI-组件 鸿蒙开发-UI-组件-状态管理 鸿蒙开发-UI-应用-状态管理 鸿蒙开发-UI-渲染控制 鸿蒙开发-UI-布局 文章目录 前言 一、基本概念 二、布局子元素 1.子元…

LoadMap9:C++的Template模板函数

1. 模板函数与模板类 模板Template和函数重载是实现静态多态的两种重要途径。对于模板而言&#xff0c;其通常用于模板函数和模板类中。其基本语法结构为&#xff1a; template <typename XXXX> // XXXX 代表定义的模板数据类型的名称1.1 模板函数 使用 template 关键…

User-Agent(用户代理)是什么?

User-Agent&#xff08;用户代理&#xff09;是什么&#xff1f; User-Agent 即用户代理&#xff0c;简称“UA”&#xff0c;它是一个特殊字符串头。网站服务器通过识别 “UA”来确定用户所使用的操作系统版本、CPU 类型、浏览器版本等信息。而网站服务器则通过判断 UA 来给客…

Android 13 关闭相册的编辑功能

介绍 因为做的是学生机&#xff0c;客户不希望相册的图片可以编辑。 分析 通过字符串我们找到了几个资源文件&#xff0c;以下只展示其中一个 路径&#xff1a;vendor/mediatek/proprietary/packages/apps/Gallery2/res/menu/operation.xml <item android:id"id/acti…

python3.7conda安装opencv

1.conda创建虚拟环境 conda create --name opencv3.7 python3.72.激活虚拟环境 conda activate opencv3.7 3.安装 opencv pip install -i https://pypi.mirrors.ustc.edu.cn/simple/ opencv-python3.4.2.16 python3.7安装opencv python 和 opencv-contrib-python的相关问题…

Hotspot源码解析-第十九章-ClassLoaderData、符号表、字符串表的初始化

第十九章-ClassLoaderData初始化 讲解本章先从一张图开始 众所周知&#xff0c;Java类的相关信息都是存储在元空间中的&#xff0c;但是是怎么存储的&#xff0c;相信很多读者是不清楚的&#xff0c;这里就不得不涉及到ClassLoaderDataGraph、classLoader、classLoaderData&…

MIT 6s081 lab 5: xv6 lazy page allocation

Page faults Basic 通过page fault可以实现一系列的虚拟内存功能&#xff1a; lazy allocationcopy-on-write forkdemand pagingmemory mapped files 虚拟内存的两个主要的优点&#xff1a; 1、隔离性&#xff1a;每个应用程序拥有自己的地址空间&#xff0c;因此不可能修…

【Dart】=> [06] Dart初体验-类Class-构造函数-继承-mixin-异步编程-链式调用-泛型-异常

目录 能够定义并使用Dart的类类的定义构造函数私有属性和方法继承mixin异步编程FutureFuture链式调用async - awaitdynamic类型泛型异常 能够定义并使用Dart的类 Dart是一门面向对象的编程语言&#xff0c;所有的对象都是类的实例 通过类我们可以对数据和方法进行封装复用 学习…

(2023版)斯坦福CS231n学习笔记:DL与CV教程 (1) | 引言与知识基础

前言 &#x1f4da; 笔记专栏&#xff1a;斯坦福CS231N&#xff1a;面向视觉识别的卷积神经网络&#xff08;23&#xff09;&#x1f517; 课程链接&#xff1a;https://www.bilibili.com/video/BV1xV411R7i5&#x1f4bb; CS231n: 深度学习计算机视觉&#xff08;2017&#xf…

NLP论文阅读记录 - 2022 | WOS 用于摘要法律文本的有效深度学习方法

文章目录 前言0、论文摘要一、Introduction1.1目标问题 二.相关工作三.本文方法四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结果4.6 细粒度分析 五 总结 前言 Effective deep learning approaches for summarization of legal texts&#xff08;22&#x…

Linux -- Nginx服务基础

4.1Nginx服务基础 Nginx(发音为[engine x])专为性能优化而开发&#xff0c;其最知名的优点是它的稳定性和低系统资源消 耗&#xff0c;以及对HTTP并发连接的高处理能力&#xff08;单台物理服务器可支持30000~50000个并发请求&#xff09;&#xff0c;正因 为如此&#xff0c;…

html中flex的使用

在HTML中&#xff0c;flex属性用于设置弹性容器的子元素的布局方式。使用flex属性可以实现灵活的布局&#xff0c;使子元素根据可用空间自动调整大小。flex属性有三个值&#xff1a;flex-grow、flex-shrink和flex-basis。 flex-grow&#xff1a;指定子元素的放大比例&#xff…

路由器路由配置解析

路由器是网络中负责转发数据包的设备&#xff0c;通过配置路由规则&#xff0c;确定数据包的传输路径。在本文中&#xff0c;我们将解析一个路由器的配置&#xff0c;并说明每个路由规则的含义。 路由器配置 rootr-63-VM:# ip route default via 192.168.157.2 dev eth1 10.1…

vscode中关于python的一些常用配置

文章目录 python cv2 提示配置第一步 配置提示信息第二部 重启vs 可能还不行&#xff0c;那就重新安装以下opencv-python 配置pytest还是如上&#xff0c;将下入的位置打开编写测试用例 配置跨文件import在工作目录中新建一个.env文件输入内容如下打开.vscode中的setting.json …

目标识别跟踪模块Tofu3

Tofu系列提供了适应不同目标、不同速率的识别跟踪模块产品系列&#xff0c;主要包括Tofu3&#xff0c;4&#xff0c;5&#xff0c;S和其他零配件&#xff0c;可以适配BT.656,Cameralink&#xff0c;网络等不同接口和协议的热红外、可见光视频。 Tofu3 是多波段视频物体识别跟踪…