实验2-1 进程相关的系统调用

一、实验目的

学习Linux中与进程控制相关的系统调用,加深对进程、进程树等概念的理解。

二、实验内容

1.    学习使用以下几类系统调用,进行编程练习

       获取进程的信息,getpid(), getppid()

父子进程控制,fork(),wait()

2.    学习熟练地使用程序的编辑vi,编译gcc,运行

3.    学习熟练地使用ps命令观察进程的状态及其关系

4.    选做:使用联机手册man,查看上述系统调用的完整指南

三、实验步骤

完成以下3个实验样例程序的编辑、编译、运行和观察。

1 通过联机手册,深入学习相应的系统调用。

2 对3个样例程序进行自主改造和实验,或者构造新的程序进行实验。

(1) 程序getpid.c

#include <stdio.h>

main()

{

       int pid;

       pid = getpid();

       printf("my pid is %d\n", pid);

       pid = getppid();

       printf("my parent’s pid is %d\n", pid);

       sleep(40);

}

1.输入程序 vi  getpid.c

2.编译连接 gcc  getpid.c  -o  getpid

3.后台运行 ./getpid  &

4. 使用 ps –l 查看进程状态,验证getpid()和getppid()系统调用,注意父子进程的关系。

5.    (选做)使用 man 2 getpid命令,查看getpid()系统调用的联机手册。

(2)程序fork.c

#include <stdio.h>

int z = 0;

main()

{

int pid = getpid();

      if (pid = fork())  {

              z = pid; 

              printf(“z1 = %d\n”, z);

       } else {

              z = pid;

              printf(“z2 = %d\n”, z);

       }

printf(“all done, pid = %d\n”, pid);

}

 1.先考虑一下,程序的输出结果是什么。

父进程:fork()返回子进程的PID,因此z被赋值为子进程的PID,然后打印出z1 = [子进程的PID]

子进程:fork()在子进程中返回0,因此z被赋值为0,然后打印出z2 = 0

在每个进程中,最后都打印all done, pid = [当前的pid]

2. 输入程序 vi  fork.c

 3. 编译连接 gcc  fork.c  -o  fork

 4. 运行 ./fork

注意观察程序的输出

5.    验证自己原先的想法是否正确,想一想为什么。

6.    (推荐)使用man 2 fork命令,查看fork的联机手册。

(3)程序mfork.c

#include <stdio.h>

main()

{

       int i, pid;

       for (i=0; i<10; i++) {

              pid = fork();

              if (pid == 0) {

                     printf("child %d starts running\n", i);

                     sleep(60+i*5);    // every child sleeps for a different period

                     exit(0);

              } else {

                     printf("parent: generate a new child with pid %d\n", pid);

                     sleep(1);

              }

       }

}

 1. 先考虑一下,程序的输出结果是什么。

父进程创建一个子进程,然后返回子进程的PID并进行输出子进程的PID

父进程打印消息"parent: generate a new child with pid [PID]"

然后子进程打印消息"child 1 starts running"

以此类推,循环十轮

来看看GPT的解释

这段代码是一个C语言程序,其主要功能是创建10个子进程,每个子进程都会睡眠一段时间,不同的子进程睡眠时间不同。我们来详细分析一下:

### 包含的头文件
```c
#include <stdio.h>
```
这行代码包含了标准输入输出库,使得程序能够使用`printf`等函数输出信息到控制台。

### main函数
程序的入口是`main`函数。这里没有指定返回类型,按照C语言的老标准,如果不指定返回类型,默认为`int`。

### 变量定义
```c
int i, pid;
```
定义了两个整型变量`i`和`pid`。`i`用于循环计数,`pid`用于存储`fork`函数的返回值。

### 循环结构
```c
for (i=0; i<10; i++) {
    // 循环体内容
}
```
这个循环会执行10次,每次循环都尝试创建一个新的进程。

### fork函数
```c
pid = fork();
```
`fork()`函数用于创建一个新的子进程,它几乎是父进程的完全复制品。`fork()`会在父进程中返回新创建的子进程的进程ID,在子进程中返回0。如果`fork`失败,它会返回一个负值。

### 子进程的行为
```c
if (pid == 0) {
    printf("child %d starts running\n", i);
    sleep(60+i*5);  // every child sleeps for a different period
    exit(0);
}
```
在子进程中(`pid`等于0的情况下),程序会输出一个消息表示子进程开始运行,并调用`sleep`函数让子进程睡眠一段时间。睡眠时间是60秒加上循环变量`i`乘以5,这意味着每个子进程都有不同的睡眠时间,从60秒到105秒不等。之后,子进程通过调用`exit(0)`正常退出。

### 父进程的行为
```c
else {
    printf("parent: generate a new child with pid %d\n", pid);
    sleep(1);
}
```
在父进程中,程序会输出一个消息表示已生成一个新的子进程,并显示其进程ID。然后父进程会睡眠1秒,这主要是为了给系统一些时间来调度新创建的子进程。

### 结论
这个程序将会创建10个子进程,每个子进程睡眠的时间比前一个多5秒。父进程在每次创建子进程后等待1秒,然后继续循环直到创建了10个子进程。每个子进程在打印消息并睡眠相应的时间后正常退出。父进程在创建完所有子进程后,由于没有代码控制其等待子进程结束或退出,所以父进程的行为将依赖于其后续代码(该代码片段中未提供)以及操作系统的行为。

2. 输入程序 vi mfork.c

 3. 编译连接 gcc  mfork.c  -o  mfork

 4. 运行 ./mfork

注意观察程序的输出

 5.  每隔几秒到十秒钟,反复使用 ps -l 命令观察。想想为什么。

注意./mfork进程的父进程号为1号进程。为什么?

子进程按进程号从小到大的顺序消失,到最后,父进程才消失

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端三剑客 —— JavaScript (第九节)

目录 内容回顾&#xff1a; 1.事件解除 2. Ajax jQuery选择器 回顾CSS选择器 CSS选择 1.基本选择器 2.包含选择器 3.伪类选择器 4.伪元素选择器 5.属性选择器 jQuery 库 jQuery 动画 系统动画 自定义动画 常见API操作 内容回顾&#xff1a; 1.事件解除 如果是使…

一文读懂RISC-V与ARM

RISC-V和ARM是近年来备受关注的两种处理器架构。RISC-V是一种基于精简指令集计算(RISC)原理的开源指令集架构(ISA)&#xff0c;而ARM是一种专有ISA&#xff0c;由于其长期存在于嵌入式系统和移动设备中&#xff0c;已成为嵌入式系统和移动设备的主导选择。市场以及多年积累的信…

安装图数据库Nebula Graph

前言 今年开始&#xff0c;很多机关单位、央国企都要求所有新建的信息系统必须走国产化技术路线&#xff0c;而且还要求满足“信创”要求。“信创”通俗来讲就是要自研&#xff0c;那种拿个开源套壳的都不满足信创要求。之前研究了一段时间的neo4j&#xff0c;显然neo4j不满足…

雪亮工程视频联网综合管理/视频智能分析系统建设方案(一)

一、行业背景 雪亮工程主要是针对农村地区治安防控的监控项目&#xff0c;在乡村的主干道、路口、人群聚集地部署高清摄像头&#xff0c;通过三级综治中心和指挥平台&#xff0c;将视频图像信息系统纵向下延至县、乡、村&#xff0c;同时利用系统拓展在安防、社会治理、智慧交…

MWeb Pro For Mac v4.5.9 强大的 Markdown 软件中文版

MWeb 是专业的 Markdown 写作、记笔记、静态博客生成软件&#xff0c;目前已支持 Mac&#xff0c;iPad 和 iPhone。MWeb 有以下特色&#xff1a; 软件下载&#xff1a;MWeb Pro For Mac v4.5.9 软件本身&#xff1a; 使用原生的 macOS 技术打造&#xff0c;追求与系统的完美结合…

Linux从入门到精通 --- 3.用户、权限

文章目录 第三章&#xff1a;3.1 root用户3.1.1 su3.1.2 exit3.1.3 sudo 3.2 用户和用户组3.2.1 用户组管理创建用户组删除用户组 3.2.2 用户管理创建用户删除用户查看用户所属组修改用户所属组 3.2.3 getent一&#xff1a;二&#xff1a; 3.3 查看权限控制信息3.3.1 认知权限信…

IDEA 控制台中文乱码 4 种解决方案

前言 IntelliJ IDEA 如果不进行相关设置&#xff0c;可能会导致控制台中文乱码、配置文件中文乱码等问题&#xff0c;非常影响编码过程中进行问题追踪。本文总结了 IDEA 中常见的中文乱码解决方法&#xff0c;希望能够帮助到大家。 IDEA 中文乱码 解决方案 一、设置字体为支…

软件安全评估之设计评审入门(上)

壹 基础概念 在软件开发生命周期&#xff08;Software Development Life Cycle&#xff0c;简称SDLC&#xff09;中&#xff0c;设计评审&#xff08;Design Review&#xff09;是一个关键的阶段&#xff0c;旨在确保软件设计满足项目需求和目标&#xff0c;并且能够高效、可靠…

GDAL源码剖析(九)之GDAL体系架构

GDAL源码剖析&#xff08;九&#xff09;之GDAL体系架构_gdal 源码-CSDN博客 在GDAL库中包含栅格数据的读写&#xff0c;矢量数据的读写&#xff0c;以及栅格和矢量数据的相关算法。下面主要对GDAL中栅格数据和矢量数据的体系架构做一个简单的说明。本人英文很烂&#xff0c;有…

集装箱5G智能制造工厂数字孪生可视化平台,推进企业数字化转型

集装箱5G智能制造工厂数字孪生可视化平台&#xff0c;推进企业数字化转型。在当下数字化转型的热潮中&#xff0c;集装箱5G智能制造工厂数字孪生可视化平台成为了推动企业转型升级的重要工具。这一平台将先进的5G技术与智能制造相结合&#xff0c;通过数字孪生技术实现生产过程…

数字化赋能农业创新发展新篇章:数字乡村建设推动农业现代化、提升农业综合效益与竞争力

目录 一、数字乡村建设的内涵与意义 二、数字化赋能农业创新发展的路径 1、推动智慧农业发展 2、加强农村电子商务建设 3、提升农业信息化水平 三、数字乡村建设推动农业现代化与提升综合效益与竞争力 1、推动农业现代化进程 2、提升农业综合效益 3、增强农业竞争力 …

HTML5+CSS3+JS小实例:图片切换特效之模糊变清晰

实例:图片切换特效之模糊变清晰 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, i…

Windows搭建Jellyfin影音服务结合内网穿透实现公网访问本地视频文件

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及&#xff0c;各种各样的使用需求也被开发出来&…

大势智慧在出模型时输入七参数可以导出地方坐标系吗?

大势智慧自主研发的网格大师或者DasViewer有坐标转换功能&#xff0c;可以使用七参数计算功能转换到地方坐标&#xff0c;直接输以前的七参是不行的&#xff0c;需要准备源坐标和目标坐标。 DasViewer是由大势智慧自主研发的免费的实景三维模型浏览器,采用多细节层次模型逐步自…

【Unity】组件组合使用心得(单行可自动拓展Scroll View)

在这之前&#xff0c;一直是在使用Scroll View进行滑动内容设置&#xff0c;但设置的都是不明不白的&#xff0c;而且有的时候设置好了之后也不知道是为什么&#xff0c;总感觉哪里不对劲&#xff0c;而且好也不知道为什么好&#xff0c;可能是长时间在做管理上的内容&#xff…

淘宝详情API接口文档(java)get调用

淘宝详情API接口是用于获取淘宝商品详细信息的接口&#xff0c;它允许开发者通过发送请求&#xff0c;获取商品的描述、价格、评价等信息。下面是一个关于淘宝详情API接口的示例文档&#xff0c;包括接口地址、请求参数、响应参数等内容。 淘宝详情API接口文档 一、接口地址 …

Lobe UI - 基于 AntDesign 开发的 AIGC Web 应用的开源 UI 组件库

今天推荐一个可以快速开发 ChatGPT UI 界面的组件库&#xff0c;质量很高&#xff0c;拿来就能用。 Lobe UI 是由 lobehub 团队开发的一套 web UI 组件库&#xff0c;和我之前推荐的很多通用型的 UI 组件库不同&#xff0c;Lobe UI 是专门为目前火热的 AIGC 应用开发而打造&am…

分布式 SpringCloudAlibaba、Feign与RabbitMQ实现MySQL到ES数据同步

文章目录 ⛄引言一、思路分析⛅实现方式⚡框架选择 二、实现数据同步⌚需求分析⏰搭建环境⚡核心源码 三、测试四、源码获取⛵小结 ⛄引言 本文参考黑马 分布式Elastic search Elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助…

R语言绘制一次和二次相关性热图

在数据探索的过程中&#xff0c;我们往往会对数据与数据的相关性进行分析&#xff0c;例如我们常用的corrplot包&#xff0c;或者psych包中的corr.test函数&#xff0c;对两两变量间的相关性进行分析。我们常常会看到这样的相关性热图&#xff1a; 但有时变量间的关系并非线性…

在线课程平台LearnDash评测 – 最佳 WordPress LMS插件

在我的LearnDash评测中&#xff0c;我探索了流行的 WordPress LMS 插件&#xff0c;该插件以其用户友好的拖放课程构建器而闻名。我深入研究了各种功能&#xff0c;包括课程创建、测验、作业、滴灌内容、焦点模式、报告、分析和管理工具。 我的评测还讨论了套餐和定价选项&…