01-系统编程

news2025/3/30 15:03:58

一、程序和进程的区别:

window系统:

1、程序存储在硬盘中,文件格式为.exe后缀,静态的

2、进程运行在内存中,动态的

Linux系统

1、程序存储在硬盘中,文件格式为.ELF(可执行的链接文件)后缀,静态的

2、进程运行在内存中,动态的

二、进程的内存划分:

1、PM实际内存,VM虚拟内存,每一个程序加载都会分配出一个虚拟内存,虚拟内存有:内核,栈,堆,数据段(.bss,.data,.rodata),代码段(.text,.init)。且每个进程的虚拟内存都是相互独立的。

2、存储空间,定义,生命周期,作用域,特点

局部变量,栈区,定义{}里面,{}里有效,{}里有效,自动分配自动释放

全局变量,数据段中,所有函数之外定义,程序死就死,整个程序有效,程序中所有函数可见

堆空间变量,堆空间中,free之前都有效,free之前都有效,手动分配手动释放

静态变量,数据段中,用static修饰,整个程序有效,静态局部变量(当前函数中),全局变量(在当前文件中)

常量、数据段,用const修饰,整个程序有效,整个程序有效,常量无法修改。

三、进程命令

1、ps       查看当前系统的进程
2、ps -e    查看当前系统的所有进程

3、 top        查看进程状态,相当于window的任务管理器
4、kill        发送一个信号给进程

有以下可选
HUP     1    终端挂断
INT     2    中断(同 Ctrl + C)
QUIT    3    退出(同 Ctrl + \)
KILL    9    强制终止
TERM   15    终止
CONT   18    继续(与STOP相反,fg/bg命令)
STOP   19    暂停(同 Ctrl + Z)

5、pstree        查看进程关系图

四、进程状态(重点)

1、进程状态:

标准图如下:

就绪态:  时间片用完,睡眠,暂停的进程都会进入到就绪态,等待CPU的调度。 
执行态:  CPU调度,获得CPU的使用权,得到时间片。       处理当前进程的数据 
睡眠态:  调用sleep函数或者 scanf..... 阻塞函数     
暂停态:  收到STOP信号后进入暂停态  
僵尸态:  进程死亡后就进入僵尸态,等待父亲收尸(回收资源)  知道儿子的死因
死亡态:  进程死亡后并且父进程回收了资源!  

2、什么是时间片?

百度可知,时间片也可成为“量子”,“处理片”即分时操作系统分配给每个正在运行进程微观上的一段CPU时间。

五、fork进程创建

1、多进程有什么用?当然是为了实现多任务的执行,提高效率!

1、fork函数:pid_t fork(void); 

头文件:#include <unistd.h>
参数:void
返回值:父进程返回子进程的pid
        子进程返回 0
        失败返回   -1

2、父子进程的资源

父子进程的内存是相互独立的,但他们的地址是一样的,创建之初他们的整个内存空间(栈,堆,数据段,代码段,标准IO等等)是一样的。

但他们的进程号PID是不一样的,因为PID是唯一的。

父子进程的数据交换:

例子如下:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
int main()
{
    // 1.创建一个文件
    int fd = open("my.txt", O_RDWR | O_CREAT, 0777);

    // 2.创建一个进程
    pid_t pid = fork();

    if (pid == 0) // 子进程
    {
        while (1)
        {
            // 读取父进程发送的数据
            char buf[1024];
            lseek(fd, 0, SEEK_SET); // 把光标偏移到文件头
            int size = read(fd, buf, sizeof(buf));
            if (size > 0)
            {
                printf("子进程接收到的数据:%s\n", buf);
            }
            sleep(2);
        }
    }

    if (pid > 0) // 父进程
    {
        while (1)
        {
            // 向子进程发送数据
            char buf[1024];
            printf("请输入要发送的数据:");
            scanf("%s", buf);
            write(fd, buf, strlen(buf)); // 写入数据到文件中
        }
    }
}

3、孤儿进程(没有父进程,即父进程先死,此时子进程会托管给系统进程(这个进程是没有父进程的))

init进程的产生过程;

孤儿进程的例子:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
int main()
{

    for (int i = 0; i < 10; i++) // 循环创建 10 个进程
    {
        // 创建一个进程
        pid_t pid = fork();
        if (pid == 0)
        {
            printf("子进程 %d\n", getpid());
            getchar(); // 阻塞等待,让子进程不死亡
        }
    }

    printf("父进程20S后死亡\n");

    sleep(20);

    printf("父进程死亡\n");
    return 0;
}

4、僵尸进程(父进程没有及时回收子进程的资源导致,即父进程不知道子进程的死因,导致子进程一直占用系统的内存资源)

例子:

#include <stdio.h>
#include <unistd.h>
int main()
{
    for (int i = 0; i < 10; i++)
    {
        // 创建一个进程
        pid_t pid = fork();
        if (pid == 0) // 子进程
        {
            printf("子进程死亡 %d\n", getpid());

            return 0; // 在子进程的内部return 结束的是子进程
        }
    }

    printf("父进程正在运行,按任意键结束\n");
    getchar();
}

所以为了防止僵尸进程的产生,父进程wait回收子进程的资源。

六、wait进程资源的回收

头文件: #include <sys/wait.h>

wait函数:pid_t wait(int *_Nullable wstatus); //等待任意一个进程退出 

            wstatus:进程退出状态 
pid_t waitpid(pid_t pid, int *_Nullable wstatus, int options); //等待指定的pid进程退出  

       pid:等待的进程pid 
   wstatus: 进程退出状态  
   options: 等待属性,默认为  0  


例子:等待任意一个进程退出

wait(NULL)
   

1、获取子进程的死亡原因及返回值。

例子:

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{
    // 创建一个子进程
    pid_t pid = fork();

    if (pid == 0)
    {
        int i = 0;
        while (1)
        {
            printf("%d 子进程正在运行 %d\n", getpid(), i++);
            sleep(1);
            if (i == 10)
            {
                printf("子进程结束\n");

                return 123; // 正常退出,传递给父进程
            }
        }
    }

    printf("父进程运行,等待子进程结束回收资源\n");

    int wstat = 0; // 退出状态码
    wait(&wstat);  // 等待任意一个子进程结束,一直等待,直到子进程结束为止

    // 判断进程的死亡原因
    if (WIFEXITED(wstat))
    {
        printf("子进程正常退出\n");

        // 获取子进程的退出值 return 值
        printf("子进程的退出值是 %d\n", WEXITSTATUS(wstat));
    }
}

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

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

相关文章

Linux编译器gcc/g++使用完全指南:从编译原理到动静态链接

一、gcc/g基础认知 在Linux开发环境中&#xff0c;gcc和g是我们最常用的编译器工具&#xff1a; gcc&#xff1a;GNU C Compiler&#xff0c;专门用于编译C语言程序g&#xff1a;GNU C Compiler&#xff0c;用于编译C程序&#xff08;也可编译C语言&#xff09; &#x1f4cc…

26考研|数学分析:定积分及应用

这一部分作为数学分析的灵魂&#xff0c;在数学分析的计算中&#xff0c;绝大部分的问题都可以转换成定积分的计算问题&#xff0c;所以在这部分的学习中&#xff0c;一定要注意提升计算能力&#xff0c;除此之外&#xff0c;由积分引出的相关积分不等式也是分析的重点和难点&a…

扩展卡尔曼滤波

1.非线性系统的线性化 标准卡尔曼滤波 适用于线性化系统&#xff0c;扩展卡尔曼滤波 则扩展到了非线性系统&#xff0c;核心原理就是将非线性系统线性化&#xff0c;主要用的的知识点是 泰勒展开&#xff08;我另外一篇文章的链接&#xff09;&#xff0c;如下是泰勒展开的公式…

4.Matplotlib:基础绘图

一 直方图 1.如何构建直方图 将值的范围分段&#xff0c;将整个值的范围分成一系列间隔&#xff0c;然后计算每个间隔中有多少值。 2.直方图的适用场景 一般用横轴表示数据类型&#xff0c;纵轴表示分布情况。 直方图可以用于识别数据的分布模式和异常值&#xff0c;以及观察数…

VSCode 市场发现恶意扩展正在传播勒索软件!

在VSCode 市场中发现了两个隐藏着勒索软件的恶意扩展。其中一个于去年 10 月出现在微软商店&#xff0c;但很长时间没有引起注意。 这些是扩展ahban.shiba 和 ahban.cychelloworld&#xff0c;目前已从商店中删除。 此外&#xff0c;ahban.cychelloworld 扩展于 2024 年 10 月…

工作流引擎Flowable介绍及SpringBoot整合使用实例

Flowable简介 Flowable 是一个轻量级的业务流程管理&#xff08;BPM&#xff09;和工作流引擎&#xff0c;基于 Activiti 项目发展而来&#xff0c;专注于提供高性能、可扩展的工作流解决方案。它主要用于企业级应用中的流程自动化、任务管理和审批流等场景。 Flowable 的核心…

K8s证书--运维之最佳选择(K8s Certificate - the best Choice for Operation and Maintenance)

K8s证书--运维之最佳选择 No -Number- 01 一个月速通CKA 为了速通CKA&#xff0c;主要办了两件事情 1. 在官方的Killercoda上&#xff0c;练习CKA的题目。把命令敲熟悉。 // https://killercoda.com/killer-shell-ckad 2. 使用K3s在多台虚拟机上快速搭建了K8s集群&…

Leaflet.js+leaflet.heat实现热力图

Leaflet热力图 #mermaid-svg-I1zXN0OrNCBGKEWy {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-I1zXN0OrNCBGKEWy .error-icon{fill:#552222;}#mermaid-svg-I1zXN0OrNCBGKEWy .error-text{fill:#552222;stroke:#5522…

通过git文件查看大模型下载链接的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

多源最短路:Floyd算法の暴力美学

多源最短路求解的是图中的任意两个节点之间的最短路。 前文我们已经讲过单源最短路&#xff0c;我们完全可以做n次单源最短路算法&#xff0c;求出任意两节点的最短距离。最快的堆优化版的 dijkstra 算法的时间复杂度为o&#xff08;m * logm&#xff09;&#xff0c;枚举n次时…

simpleITK - Setup - Pythonic Syntactic Sugar

Pythonic Syntactic Sugar Image Basics Notebook 非常简单&#xff0c;与 ITK 的 C 接口非常接近。 Sugar非常棒&#xff0c;它能让你精力充沛&#xff0c;更快地完成任务&#xff01;SimpleITK 也应用了大量Sugar来帮助更快地完成任务。 %matplotlib inline import matplo…

下载vmware17

我用VMware10安装ubuntu24&#xff0c;死活不能成功&#xff0c;要么突然退出&#xff0c;要么装着装着&#xff0c;眼看完成&#xff0c;居然卡住不动&#xff0c;一查日志&#xff0c;提示光盘读取失败&#xff08;用的ISO文件&#xff0c;居然装模作样的说光驱读取失败&…

德昂观点:如何看待MicroStrategy改名为Strategy?

2025年2月&#xff0c;纳斯达克上市公司MicroStrategy&#xff08;股票代码&#xff1a;MSTR&#xff09;宣布更名为“Strategy”&#xff0c;并同步启用全新品牌标识与橙色主视觉。这不仅是品牌形象的更新&#xff0c;更是公司战略方向的明确宣示。德昂作为MSTR中国区BI合作伙…

嵌入式八股RTOS与Linux---网络系统篇

前言 关于计网的什么TCP三次握手 几层模型啊TCP报文啥的不在这里讲,会单独分成一个计算机网络模块   这里主要介绍介绍lwip和socket FreeRTOS下的网络接口–移植LWIP 实际上FreeRTOS并不自带网络接口,我们一般会通过移植lwip协议栈让FreeRTOS可以通过网络接口收发数据,具体可…

Django 生成 ssl 安全证书,切换 https、wss协议(daphne 、nginx)

Django 普通 http 协议不够安全&#xff0c;无法支持连接本地摄像头&#xff08;虽然在本地 localhost 上能连&#xff09;&#xff0c;此时需要切换成 https 协议&#xff08;先提个醒&#xff0c;我这个方法最后失败了&#xff0c;不过对您应该也有帮助&#xff09; 目录 配置…

告别Win10强制更新:永久关闭系统更新指南

你是否厌倦了Win10在开关机时的强制自动更新&#xff1f;无论你是在赶时间还是专注于工作&#xff0c;那突如其来的更新提示总是让人不胜其烦。屏幕上那句“正在更新&#xff0c;请勿关闭电源”的提示&#xff0c;仿佛是对你无奈的嘲笑。别担心&#xff0c;今天我将教你如何永久…

罗杰斯特回归

定义 逻辑回归其实就是原来的线性回归加了激活函数&#xff0c;这个函数其实就是sigmoid函数&#xff0c;把一个回归的连续数值压缩到了0到1的空间&#xff0c;其实只要有函数能够满足把数值压缩到0,1之间就可以&#xff08;因为0到1之间的数值就是概率值&#xff09; 对于分类…

【嵌入式学习2】C语言 - VScode环境搭建

目录 ## 语言分类 ## c语言编译器 ## VScode相关配置 ## 语言分类 编译型语言&#xff1a;C&#xff0c;C解释型语言&#xff1a;python&#xff0c;JS ## c语言编译器 分类GCC 系列MinGWCygwinMSVC系列一套编程语言编译器将GCC编译器和GNU Binutils移植到Win32平台下的产物…

利用脚本和Shader制作屏幕后处理效果

一、屏幕后处理的实现原理 该屏幕后处理的原理是将渲染完成后的屏幕纹理通过脚本和Shader完成一些操作&#xff0c;然后实现各种屏幕效果 而实现屏幕后处理效果的主要操作就是获得当下渲染完成后的屏幕图像&#xff0c;其中unity提供了一个函数用于获取此图像——OnRenderIma…

【银河麒麟系统常识】命令:uname -m(查看系统架构)

命令&#xff1a; uname -m 功能 常用的 Linux/Unix 终端命令&#xff0c;用于显示当前系统的硬件架构&#xff1b; 返回 返回系统的CPU架构类型&#xff0c;用于判断软件兼容性&#xff1b; 输出结果架构说明常见设备x86_64Intel/AMD 64位 CPU主流 PC、服务器aarch64ARM 64位 …