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

news2024/12/30 0:58:56

关于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.coloradmin.cn/o/1373920.html

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

相关文章

微信/QQ/百度网盘/QQ邮箱上传附件/网络上传文件很慢怎么办?

文章目录 前言解决 前言 继上一次遇到这个问题没几天&#xff0c;期间也断断续续遇到过一点 以为还是因为硬件原因&#xff0c;再一次进行长按关机键放静电&#xff0c;但是这次就没有效果了&#xff0c;上传还是超级慢。 此时我就以为我的电脑坏了&#xff0c;差点拿去修 直到…

武汉灰京文化:跨平台游戏的崛起,破壁无界,畅游全场!

随着科技的飞速发展&#xff0c;游戏平台之间的界限逐渐模糊&#xff0c;许多优秀的游戏已经不再只局限于单一的游戏设备平台。无论你身处何处&#xff0c;只要有网络连接&#xff0c;你就可以随时随地畅玩自己喜欢的游戏&#xff0c;而无需更换设备或重新安装&#xff0c;这无…

缓存代理服务器

1 缓存代理 1.1 缓存代理的概述 web代理的作用 缓存网页对象&#xff0c;减少重复请求 存储一些之前被访问的或且可能将要备再次访问的静态网页资源对象&#xff0c;使用户可以直接从缓存代理服务器获取资源&#xff0c;从而减少上游原始服务器的负载压力&#xff0c;加快整…

算法与数据结构--最小生成树算法

一.应用的场景 类似于这种最小成本问题&#xff0c;实际上就是计算加权图把所有点连起来权重之和最小值的时候是怎么连接的。类似的问题还有最短耗时之类的问题。 二.最小生成树的定义 生成树&#xff1a; 图的生成树是它的一颗含有其所有顶点的无环连通子图。 【简单说就是所…

Apache ActiveMQ RCE CNVD-2023-69477 CVE-2023-46604

漏洞简介 Apache ActiveMQ官方发布新版本&#xff0c;修复了一个远程代码执行漏洞&#xff0c;攻击者可构造恶意请求通过Apache ActiveMQ的61616端口发送恶意数据导致远程代码执行&#xff0c;从而完全控制Apache ActiveMQ服务器。 影响版本 Apache ActiveMQ 5.18.0 before 5.1…

ssh | OpenSSH - with TCP port forwarding | ssh通过 tcp转发数据 | ssh 隧道

讲的会有点啰嗦 一次抓包 发现的问题 tcpdump -vvv -X -n -i any -s0 host “xx.xx.xx.xx” and port 22 -w xxx.pcap 然后从数据中发现了一问题&#xff0c;总所周知&#xff0c;ssh 通过加密的方式传递数据 多以 也会把 ssh 当作隧道 通信 然后在抓的数据中发现了一些 tcp协议…

jmeter监控服务器资源使用情况

GitHub - undera/perfmon-agent: Server metrics fetching agent, based on SIGAR 下载安装包&#xff1a;ServerAgent-2.2.3.zip 解压先 启动&#xff0c;如果是windows运行startAgent.bat&#xff0c;如果是linux运行startAgent.sh 注意&#xff1a;linux上注意权限的问题…

CRM系统进行市场营销,这些功能可以派上用场。

现如今的企业想要做好营销&#xff0c;不仅仅依赖于一句玄之又玄的slogan亦或是电子邮件的狂轰乱炸。要想做好市场活动营销需要一个前提——那就是CRM管理系统发挥作用的地方。但CRM系统关于营销的功能太多了——对于不太了解的人来说很容易不知所措。那么&#xff0c;CRM系统做…

超声波清洗机哪个品牌值得推荐?值得入手超声波清洗机都在这

在繁忙的生活中&#xff0c;配戴眼镜朋友都清楚&#xff0c;眼镜常常因为各种污渍而失去原有的光泽&#xff0c;刚新配的眼镜是蹭蹭亮的&#xff0c;佩戴一段时间后就没有原先那么亮了&#xff0c;镜片上沾满了污渍、灰尘等&#xff0c;眼镜支架缝隙中也是一样&#xff0c;普通…

大话 JavaScript(Speaking JavaScript):第十六章到第二十章

第十六章&#xff1a;变量&#xff1a;作用域、环境和闭包 原文&#xff1a;16. Variables: Scopes, Environments, and Closures 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 本章首先解释了如何使用变量&#xff0c;然后详细介绍了它们的工作方式&#xff08;环境…

python爬虫实战(10)--获取本站热榜

1. 需要的类库 import requests import pandas as pd2. 分析 通过分析&#xff0c;本站的热榜数据可以直接通过接口拿到&#xff0c;故不需要解析标签&#xff0c;请求热榜数据接口 url "https://xxxt/xxxx/web/blog/hot-rank?page0&pageSize25&type" #本…

【集合大练习】---------------简易学生管理系统

目标&#xff1a; 实现学生对象新增&#xff0c;删除&#xff0c;查看&#xff0c;对象信息修改 整体实现思路&#xff1a; 1.定义学生类-------------创建学生对象 2.管理界面代码编写-------------命令提示面板 3.添加学生的代码编写---------add功能实现 4.查看学生信…

哪个品牌的运动耳机比较好?哪个运动耳机好?2024年运动耳机推荐

​对于追求健康生活方式的人&#xff0c;高质量的运动耳机是维持锻炼动力和专注的不可或缺的装备。在跑步、骑行或进行其他形式的锻炼时&#xff0c;运动耳机能为我们提供动感的音乐&#xff0c;为运动体验增添活力。以下是市场上一些表现出色的运动耳机&#xff0c;都来看看有…

红黑树的了解以及代码实现

什么是红黑树 红黑树是在二叉搜索树的基础上添加颜色&#xff0c;通过对任何一条路径的颜色的限制&#xff0c;确保红黑树的任何一条路径不会超过其他路径的两倍&#xff0c;是一棵近似平衡的树。 红黑树的节点不是红色就是黑色&#xff0c;其节点的排列除了需要按二插搜索树的…

微信,支付宝“免密支付”,关闭教程!

不久前&#xff0c;一位中年妇女捡到了一部手机&#xff0c;并使用免密支付的方式消费掉了手机里的所有余额。这一事件在微博上成为了热搜话题&#xff0c;引起了网友们的热议。 据报道&#xff0c;一名泸州市的居民在捡到一部他人的手机后&#xff0c;发现该手机没有设置锁屏密…

全网最详细mysql5.7安装(保姆级别)

文章目录 数据库MySQL5.7安装包安装环境变量配置检测是否安装配置成功MySQL 启动和关闭 数据库 概念&#xff1a;数据库&#xff08;DataBase&#xff09;简称&#xff1a;DB 用于存储和管理数据的仓库 数据库的特点 1、持久化存储数据&#xff0c;其实数据库就是一个文件系统…

【MATLAB】 TVFEMD信号分解算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~ 1 基本定义 TVFEMD (Time-Variant Filtered Empirical Mode Decomposition) 是一种信号分解算法&#xff0c;它是基于 EMD (Empirical Mode Decomposition) 方法发展而来的。 EMD是一种自适应的数据分析方法&#xff0…

微电网能效管理系统在寿宁县五校迁建项目的设计与应用——安科瑞赵嘉敏

基本信息&#xff1a; 项目名称&#xff1a;寿宁县五校迁建项目(现为寿宁县一中)企业微电网能效管理系统 项目地点&#xff1a;福建省寿宁县 实施时间&#xff1a;2023年4月 项目总览图&#xff1a; 项目简介&#xff1a; 寿宁县第一中学创办于1938年7月&#xff0c;是一所…

目标跟踪算法的目标丢失与遮挡处理 - 注意力机制

目标跟踪算法在处理目标遮挡和丢失情况时&#xff0c;采用了多种技术和策略。这些技术主要集中在提高算法的鲁棒性和适应性上&#xff0c;使其能够在复杂环境中有效跟踪目标。以下是一些常见的处理方法&#xff1a; 多模型融合&#xff1a;通过结合多个跟踪模型或特征表示&…

Container ansible disguises local ansible 【容器 ansible 伪装本地 ansible】

预备条件&#xff1a; ctr & crictl $ nerdctl & containerd install了解 kubespray 是什么 kubespray 包含 ansible、ansible-playbook命令以及通过kubespray项目安装kubernetes集群的介质。 nerdctl pull quay.io/kubespray/kubespray:v2.23.1 nerdctl save -o qu…