操作系统进程管理实验

news2024/11/18 10:15:45
父子进程

用系统调用fork()函数实现子进程的创建,熟悉进程创建的执行过程。

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

int main() {
    // 打印主进程的 PID
    printf("hello, world (pid: %d)\n", (int)getpid());

    // 创建子进程
    int rc = fork();

    // 错误处理:如果 fork() 失败
    if (rc < 0) {
        fprintf(stderr, "fork failed\n");
        exit(1);
    }
    // 子进程执行的部分
    else if (rc == 0) {
        printf("hello, I am the child (pid: %d)\n", (int)getpid());
    }
    // 父进程执行的部分
    else {
        printf("hello, I am the parent of %d (pid: %d)\n", rc, (int)getpid());
    }

    return 0;
}

wait 等待可以等待子进程完毕,避免子进程结束后资源无法收回成为僵尸进程。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

int main() {
    // 打印主进程的 PID
    printf("hello, world (pid: %d)\n", (int)getpid());

    // 创建子进程
    int rc = fork();

    // 错误处理:如果 fork() 失败
    if (rc < 0) {
        fprintf(stderr, "fork failed\n");
        exit(1);
    }
    // 子进程执行的部分
    else if (rc == 0) {
        printf("hello, I am the child (pid: %d)\n", (int)getpid());
    }
    // 父进程执行的部分
    else {
        int status;
        wait(&status);
        printf("hello, I am the parent of %d (pid: %d)\n", rc, (int)getpid());
        printf("%d",status);
    }

    return 0;
}

到现在可以明确一个道理,else 只是为了区分子进程和父进程谁先执行,但是子进程和父进程的代码块就是他们一定会执行的一些逻辑操作。你可以在不同代码块加上exit或者return 。把他当作一个程序去写。
image.png

编写一个程序,在调用fork()之前,让主进程访问一个变量(例如x),并将其值设置为某个值(例如100)。请问子进程中的变量是什么值?当子进程和父进程都改变x的值时,该变量会发生什么?

具体来说,fork() 会创建一个子进程,但在最开始,父进程和子进程的内存内容是相同的,并不是完全独立的。它们共享同一块内存区域,直到其中一个进程修改了某个变量(比如 x),操作系统才会为修改该变量的进程分配一块新的内存副本。

关键点:

  • 初始共享fork() 后,父子进程在内存中是共享的,直到其中一个进程进行写操作。父子进程并不会立刻各自拥有独立的内存副本。
  • 写时复制(COW):当父进程或子进程修改某个共享的内存区域时,操作系统会为该进程创建一个独立的副本(这就是写时复制),确保两个进程不互相影响。

举个例子:

  • 假设在 fork() 之后,父进程和子进程都访问变量 x,初始时它们的 x 值相同。
  • 只有当父进程或子进程修改 x 时,操作系统才会为修改 x 的进程分配新的内存副本。

所以,尽管在 fork() 之后父子进程的内存空间是独立的,实际操作中,它们初始时通过写时复制共享了内存,直到其中一个进程做出修改。

wait 前面的逻辑
如果在父进程调用 wait() 函数之前还有其他的逻辑,父进程会执行这些逻辑,并 不会立即 等待子进程。

wait() 函数的作用是使父进程等待其子进程的结束,直到子进程退出并收集到它的退出状态。如果在调用 wait() 之前执行了其他操作,父进程在这些操作完成后才会进入等待状态。所以,如果在 wait() 之前有逻辑执行,那么父进程会先执行这些逻辑,直到程序执行到 wait(),才会开始等待子进程的结束。我好像突然懂了。一般来讲子进程和父进程并发执行,但是如果说子进程先执行,其实父进程wait函数就没作用,但是父进程先执行,执行到wait会自动等待

执行命令

#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <fcntl.h>    // open() 等相关头文件
#include <unistd.h>   // read(), write() 等相关头文件
#include <string.h>   // strlen() 用于获取字符串长度

int main() {
    // 打印主进程的 PID
    printf("hello, world (pid: %d)\n", (int)getpid());
    // 创建子进程
    int rc = fork();
    // 错误处理:如果 fork() 失败
    if (rc < 0) {
        fprintf(stderr, "fork failed\n");
        exit(1);
    }
    // 子进程执行的部分
    else if (rc == 0) {
        char *args[] = { "ps", "aux", NULL };
        execvp(args[0], args);  // execvp 用于执行外部命令
        printf("hello, I am the child (pid: %d)\n", (int)getpid());
        return 1;
    }
    // 父进程执行的部分
    else {
        int status;
        wait(&status);
        printf("hello, I am the parent of %d (pid: %d)\n", rc, (int)getpid());
        printf("%d\n",status);

    }

    return 0;
}

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

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

相关文章

DB Type

P位 p 1时段描述符有效&#xff0c;p 0时段描述符无效 Base Base被分成了三个部分&#xff0c;按照实际拼接即可 G位 如果G 0 说明描述符中Limit的单位是字节&#xff0c;如果是G 1 &#xff0c;那么limit的描述的单位是页也就是4kb S位 S 1 表示代码段或者数据段描…

获取当前程序运行时的栈大小[C语言]

废话前言 一晃已经毕业了4年&#xff0c;也在某个时间点&#xff0c;从面试者转变成了面试官。 进行第一次面试的时候&#xff0c;我好像比候选人还慌张&#xff0c;压根不知道问什么&#xff0c;好在是同行业&#xff0c;看着简历问了一些协议内容以及模块设计思路&#xff0…

新160个crackme - 098-DueList.4

运行分析 需破解Name和Code PE分析 ASM汇编程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 ida搜索找到关键字符串 ida动态调试&#xff0c;逻辑如上 算法分析 Name concealstr_1 SU7CSJKF09NCSDO9SDF09SDRLVK7809S4NF str_2 A1LSK2DJF4HGP3QWO5EIR6UTYZ8MXN…

ETH钱包地址如何获取 如何购买比特币

首先我们要先注册一个交易所 Gate.io&#xff08;推荐&#xff09;: 点我注册 1、注册很简单&#xff0c;通过手机号就可以进行注册了。 2、获取ETH钱包地址 注册好之后&#xff0c;如图所示&#xff0c;点击“统一账户” 3、通过搜索栏搜索ETH&#xff0c;如下图所示 4、点…

【HOT100第五天】搜索二维矩阵 II,相交链表,反转链表,回文链表

240.搜索二维矩阵 II 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 先动手写写最简单方法&#xff0c;二重循环。 class Solution { public:bool searchMa…

.NET 9与C# 13革新:新数据类型与语法糖深度解析

记录&#xff08;Record&#xff09;类型 使用方式&#xff1a; public record Person(string FirstName, string LastName); 适用场景&#xff1a;当需要创建不可变的数据结构&#xff0c;且希望自动生成 GetHashCode 和 Equals 方法时。不适用场景&#xff1a;当数据结构需…

冠层四流近似模型的发展历史

1. Kunbelka-Munk theory This is the earlist model using a two-stream approximation d I d z − ( k s ) I s J d J d z ( k s ) J − s I \begin{aligned} &\frac{dI}{dz} -(ks)IsJ\\ &\frac{dJ}{dz} (ks)J - sI \end{aligned} ​dzdI​−(ks)IsJdzdJ​(…

MySQL-关联查询和子查询

目录 一、笛卡尔积 二、表连接 1、内部连接 1.1 等值连接 1.2 非等值连接 2、外部链接 2.1 左外连接-LEFT JOIN 2.2 右外连接-RIGHT JOIN 2.3 全关联-FULL JOIN/UNION 三、子查询 1、嵌套子查询 2、相关子查询 3、insert和select语句添加数据 4、update和select语…

云计算虚拟化-kvm创建虚拟机

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 虚拟化&#xff0c;简单来说就是把一台服务器/PC电脑&#xff0c;虚拟成多台独立的虚拟机&#xff0c;每台虚拟机之间相互隔…

计算机编程中的设计模式及其在简化复杂系统设计中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 计算机编程中的设计模式及其在简化复杂系统设计中的应用 计算机编程中的设计模式及其在简化复杂系统设计中的应用 计算机编程中的…

编程考古-计算机发展(中)

晶体管计算机时代 尽管真空管技术标志着计算机步入了现代化的门槛&#xff0c;但其固有的局限性——庞大的体积、高昂的能耗、频繁的故障以及不菲的成本——极大地阻碍了其普及与实际应用。 晶体管的早期 Point-contact transistor 点接触晶体管 1947年&#xff0c;贝尔实验…

vue2+3 —— Day5/6

自定义指令 自定义指令 需求&#xff1a;当页面加载时&#xff0c;让元素获取焦点&#xff08;一进页面&#xff0c;输入框就获取焦点&#xff09; 常规操作&#xff1a;操作dom “dom元素.focus()” 获取dom元素还要用ref 和 $refs <input ref"inp" type&quo…

报错 No available slot found for the embedding model

报错内容 Server error: 503 - [address0.0.0.0:12781, pid304366] No available slot found for the embedding model. We recommend to launch the embedding model first, and then launch the LLM models. 目前GPU占用情况如下 解决办法: 关闭大模型, 先把 embedding mode…

Maven 构建项目

Maven 是一个项目管理和构建工具&#xff0c;主要用于 Java 项目。它简化了项目的构建、依赖管理、报告生成、发布等一系列工作。 构建自动化&#xff1a;Maven 提供了一套标准化的构建生命周期&#xff0c;包括编译、测试、打包、部署等步骤&#xff0c;通过简单的命令就可以执…

【C++笔记】C++三大特性之多态

【C笔记】C三大特性之多态 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;C笔记 文章目录 【C笔记】C三大特性之多态前言一.多态1.1 多态的概念1.2 虚函数1.3 虚函数的重写/覆盖1.4 多态的定义及实现 二.虚函数重写的⼀些其他问题2.1 协变(…

【项目实战】基于 LLaMA-Factory 通过 LoRA 微调 Qwen2

【项目实战】基于 LLaMAFactory 通过 LoRA 微调 Qwen2 一、项目介绍二、环境准备1、环境准备2、安装LLaMa-Factory3、准备模型数据集3.1 模型准备3.2 数据集准备 三、微调1、启动webui2、选择参数3、训练 四、测试五、总结 一、项目介绍 LLaMA-Factory是一个由北京航空航天大学…

内容占位符:Kinetic Loader HTML+CSS 使用CSS制作三角形原理

内容占位符 前言 随着我们对HTML和CSS3的学习逐渐深入&#xff0c;相信大家都已经掌握了网页制作的基础知识&#xff0c;包括如何使用HTML标记构建网页结构&#xff0c;以及如何运用CSS样式美化页面。为了进一步巩固和熟练这些技能&#xff0c;今天我们一起来完成一个有趣且实…

SpringSecurity 鉴权认证入门讲解

​ Spring Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro&#xff0c;它提供了更丰富的功能&#xff0c;社区资源也比Shiro丰富。 ​ 一般来说中大型的项目都是使用SpringSecurity 来做安全框架。小项目有Shiro的比较多&#xff0c;因为相比与Sp…

【插件】多断言 插件pytest-assume

背景 assert 断言一旦失败&#xff0c;后续的断言不能被执行 有个插件&#xff0c;pytest-assume的插件&#xff0c;可以提供多断言的方式 安装 pip3 install pytest-assume用法 pytest.assume(表达式,f’提示message’) pytest.assume(表达式,f‘提示message’) pytest.ass…

虾皮:LLM注意力机制的下沉现象分析

&#x1f4d6;标题&#xff1a;When Attention Sink Emerges in Language Models: An Empirical View &#x1f310;来源&#xff1a;arXiv, 2410.10781 &#x1f31f;摘要 &#x1f538;语言模型&#xff08;LM&#xff09;将大量注意力分配给第一个标记&#xff0c;即使它在…