系统编程-进程初步2

news2024/9/19 22:22:45

进程初步2

目录

进程初步2

1、进程等待清理函数(wait)

2、等待指定的子进程(waitpid)

3、新的开辟进程的函数(vfork)

4、在程序中运行系统下的指令(system)

5、exec 函数族

例题:

tip1:特殊进程

0号进程

祖先进程

孤儿进程

僵尸进程

tip2:


1、进程等待清理函数(wait)

-- 函数头文件

  • #include <sys/types.h>
  • #include <sys/wait.h>

-- 函数原型

  • pid_t wait(int *wstatus);

-- 函数的作用:

  • 阻塞当前进程 等待子进程死亡

alt text

  • 子进程死亡 解除阻塞 并执行资源的回收

alt text

alt text

  • 获取子进程的退出状态

-- 函数的参数:

  • int *wstatus:用来接收子进程的退出状态
  • 子进程调用exit函数进行退出的参数会放到这里

alt text

  • 通过宏定义可以判断是否为正常退出
  • WIFEXITED(wstatus)
    -- 返回为真     进程为正常结束      如:exit、_exit、 main函数的return
    -- 返回为假      非正常结束    如:段错误、    kill 等
  • WEXITSTATUS(wstatus)
    -- 可以将子进程exit中的参数解出来

alt text

-- 函数的返回值:

  • 成功返回 死亡的子进程的进程号
  • 失败返回 -1

alt text

2、等待指定的子进程(waitpid)

-- wait函数等待的任意一个子进程,谁先死,先执行那个,而下面这个函数可以等待具体哪个进程。

  • pid_t waitpid(pid_t pid, int *wstatus, int options)

-- 函数的作用:

  • 根据参数的填写 进行相应的等待函数操作
  • 判断子进程的状态 是否死亡是否为正常退出
  • 获取子进程的返回值

-- 函数的参数:

  • pid:填写要进行等待的指定子进程进程号
  • -1:任意的一个子进程
  • ‘>0’:指定的子进程
  • wstatus:用来存放子进程的退出状态以及返回值
  • options:填写是否阻塞等待
  • 0:阻塞等待
  • WNOHANG:非阻塞

alt text

alt text

alt text

-- 函数的返回值:

  • 成功返回 死亡的子进程的进程号
  • 失败返回 -1

3、新的开辟进程的函数(vfork)

-- 函数的头文件

  • #include <sys/types.h>
  • #include <unistd.h>

-- 函数的原型

  • pid_t vfork(void);

-- 函数的作用:

  • 创建一个新的子进程并阻塞父进程
  • 子进程共用父进程的资源空间
  • 子进程退出之后 父进程开始运行
  • 运行顺序 子先父后

-- 函数的返回值:

  • 子进程中返回 0
  • 父进程中返回 子进程进程号

注:使用vfork子进程如果使用main函数中的return会出现段错误
我们需要在子进程中,使用_exit来进行退出 或者使用exec函数族来实现

alt text

alt text

4、在程序中运行系统下的指令(system)

-- 函数头文件

  • #include <stdlib.h>

-- 函数原型

  • int system(const char *command)

-- 函数的作用:

  • 运行系统下的指令

-- 函数的参数:

  • command:要运行的指令

alt text

-- 可以执行系统命令,主要原理是创建一个子进程,用exec函数族中的其中一个函数执行系统命令

-- 所以可以用fork函数和exec函数族中的函数写出来达到system函数的作用

5、exec 函数族

-- exec函数族中的函数功能效果是完全一样的,只是传参不同,所以只需要记住一个函数原型即可。

-- 主要用来执行系统下的指令 或者 程序

  • #include <unistd.h>

  • int execl(const char *pathname, const char arg, ... / (char *) NULL */);

  • int execlp(const char *file, const char arg, ... / (char *) NULL */);

  • int execle(const char *pathname, const char arg, ... /, (char *) NULL, char *const envp[] */);

  • int execv(const char *pathname, char *const argv[]);

  • int execvp(const char *file, char *const argv[]);

  • int execvpe(const char *file, char *const argv[], char *const envp[]);

-- 以上函数的作用:

  • 1 写在这些函数下面的内容就不会运行了 这些函数会将程序的原本内容进行替换
  • 2 他会获取新的空间资源 但是原本的进程号不变

-- int execl(const char *pathname, const char arg, ... / (char *) NULL */);

  • pathname:填写要运行的文件的绝对路径
  • arg:要运行的指令
  • arg1: 选项 和参数 等内容
  • 以 NULL 结尾

alt text

-- 并且在子进程中执行execl函数时,父进程是非阻塞的状态。

-- int execlp(const char *file, const char arg, ... / (char *) NULL */);

  • file:直接给指令名称
  • arg:指令
  • argx:参数和选项
  • 以 NULL 结尾
  • 例如:execlp("ls","ls","-l",NULL);

-- int execv(const char *pathname, char *const argv[]);

  • pathname:指令所在的绝对路径
  • argv:指向运行的内容
  • char * a[] = {"ls","-l",NULL};
  • execv("/bin/ls",a);

例题:

-- 实现自动循环播放音乐

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

#include <stdio.h>

//实现自动循环播放音乐

int main(int argc, char const *argv[])
{
    int n=0;
    
    while(1){
    n++;
    pid_t pid = vfork();
    if(pid == 0){   //子进程
        printf("Im son\n");
        switch(n)
        {
            case 1:execl("/bin/mpg123","mpg123","/home/pimouren/learn/系统编程/5 进程初步/music/benxi.mp3",NULL);
            
            break;
            case 2:execl("/bin/mpg123","mpg123","/home/pimouren/learn/系统编程/5 进程初步/music/daoxiang.mp3",NULL);
            
            
            break;
            case 3:execl("/bin/mpg123","mpg123","/home/pimouren/learn/系统编程/5 进程初步/music/苏打绿 - 小情歌.mp3.mp3",NULL);
            break;
            default:n=0;break;

        }
    
    }else if(pid > 0)   // 父进程
    {

        printf("**********\n");
        pid_t a = wait(NULL);
        if(a == pid)
        {
            printf("音乐播放完毕,开启下一首\n");
        }
    }
    }
    
    return 0;
}

tip1:特殊进程

0号进程
  • 操作系统的引导程序
祖先进程
  • 操作系统启动的第一个程序,1号进程
孤儿进程
  • 父进程先退出,子进程被init接管,子进程退出后init会回收其占用的相关资源

  • 缺点:子进程的相关资源无法清理回收

僵尸进程
  • 子进程先退出,父进程没有回收子进程的资源,导致子进程无法回收

-- 一种非常特殊的进程,它几乎已经放弃了所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,除此之外,僵尸进程不再占有任何内存空间

tip2:

-- pstree 命令可以用来查看进程树,包括所有的子进程。它以树形结构显示当前系统中的进程及其父子关系,使得理解进程间的层级关系变得更加直观。

使用方法很简单,只需在终端中输入 pstree 命令即可。
-- 如果你想查看特定用户的进程树,可以使用 -u 选项,例如:

  • pstree -u 用户名

-- 此外,你也可以使用 -p 选项来显示进程的 PID(进程ID):

  • pstree -p

-- 如果你只想查看某个特定进程及其子进程,可以在命令后面加上该进程的 PID,例如:

  • pstree -p 1234
    -- 这将显示 PID 为 1234 的进程及其子进程的树形结构。

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

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

相关文章

初识指针4の学习笔记

目录 1>>前言 2>>字符指针变量 3>>数组指针变量 4>>函数指针变量 5>>函数指针数组 6>>回调函数是什么&#xff1f; 7>>结语 1>>前言 今天我会继续分享一些我做的笔记&#xff0c;以及我对指针的理解&#xff0c; 后续会…

查看会议所属CCF级别(A/B/C类会议)

步骤&#xff1a; 1、打开中国计算机学会官网&#xff1a;中国计算机学会 (ccf.org.cn)。 2、搜索框中输入会议名称&#xff0c;例如&#xff1a;SIGKDD。 3、点击打开如图所示来源是“学术评价”的网页。 4、进入如下页面。 可以看到&#xff0c;SIGKDD是CCF A类会议。 参考…

低代码: 关于Test Driven Development - 测试驱动开发组件与测试示例

TDD 的开发方式 Test Driven Development - 测试驱动开发这是一种非常有意思的开发方式,我们进入一个实际场景,拿需要自研的colorpicker表单组件来说表单中的很多属性,都需要进行一个颜色的选择,如背景颜色,字体颜色等等我们来看一下相关设计交互在这里我们分两个图,点击…

python的导入包飘红

本文是mac的解决方法 1、点击pycharm-preferences-paython interpreter 直接搜索你要导入的包名&#xff0c;选择版本号点击 install 2、第二种方法是命令 pip3 install pandas2.2.2

学习文件IO,让你从操作系统内核的角度去理解输入和输出(理论篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

day06——前后端交互

一、计算属性 计算属性就是基于现有的数据推算出来的新属性&#xff0c;只要依赖的数据变化&#xff0c;新属性就会自动更新&#xff0c;而且计算属性多次调用的情况下只会计算一次&#xff0c;效率非常高 简化写法 const app new Vue({ el: #app, data: {}, methods: {//跟da…

易境通海运系统:打造海运专线稳定合作的强力引擎

对于海运专线而言&#xff0c;稳定的合作伙伴至关重要。在激烈的市场竞争中&#xff0c;如何持续保持客户的高满意度&#xff0c;不断强化自身优势&#xff0c;并提升用户粘性&#xff0c;是众多海运专线必须面对并解决的问题。而拥有一套可靠的系统&#xff0c;提供完备的服务…

会“坐”电梯,能避障碍,AGV无人搬运车进入各行各业

AGV 近年来&#xff0c;自动导引车&#xff08;Automated Guided Vehicle&#xff0c;简称AGV&#xff09;作为一种先进的物流设备&#xff0c;在制造业中广泛应用。AGV是一种能够自主行驶的无人驾驶车辆&#xff0c;通过内置的导航系统和传感器&#xff0c;实现对环境的感知与…

Loop Map 循环的几种方法

参考 Using entrySet() public void iterateUsingEntrySet(Map<String, Integer> map) {for (Map.Entry<String, Integer> entry : map.entrySet()) {System.out.println(entry.getKey() ":" entry.getValue());} } Iterator<Map.Entry<String…

Apache CloudStack Official Document 翻译节选(七)

关于 Apache CloudStack 的 最佳实践 &#xff08;一&#xff09; Best Practices 部署Apache CloudStack是极具挑战性的&#xff0c;在整个部署过程中需要你做出形形色色的技术性选择。Apache CloudStack的配置条目是相当灵活的&#xff0c;这是因为在组合和配置具体条目时有…

手机谷歌浏览器怎么用

谷歌浏览器不仅在PC端受欢迎&#xff0c;在移动端也是广泛应用的。为了帮助大家更好的理解和使用手机谷歌浏览器&#xff0c;本文将详细介绍如何使用手机谷歌浏览器&#xff0c;对这款浏览器感到陌生的话就快快学起来吧。&#xff08;本文由https://chrome.cmrrs.com/站点的作者…

动手学深度学习7.6 残差网络(ResNet)-笔记练习(PyTorch)

本节课程地址&#xff1a;29 残差网络 ResNet【动手学深度学习v2】_哔哩哔哩_bilibili 29.2 ResNet为什么能训练出1000层的模型【动手学深度学习v2】_哔哩哔哩_bilibili 本节教材地址&#xff1a;7.6. 残差网络&#xff08;ResNet&#xff09; — 动手学深度学习 2.0.0 docume…

制造企业MES系统质检管理的应用

MES系统在质检管理中的作用 MES系统通过集成生产过程中的各个环节&#xff0c;实现对产品质量的全面监控和管理。其在质检管理中的作用主要体现在以下几个方面&#xff1a; 1. 实时数据采集&#xff1a;MES系统能够实时收集生产线上的质量数据&#xff0c;包括但不限于产品尺…

知识改变命运 数据结构【栈和队列面试题】

1.最小栈 class MinStack {Stack <Integer>stack;Stack <Integer>minStack; public MinStack() {stacknew Stack<>();minStacknew Stack<>();}public void push(int val) {stack.push(val);if(minStack.empty()) {minStack.push(val);} else {int top…

汇昌联信科技做拼多多电商怎么提升浏览量?

随着电子商务的蓬勃发展&#xff0c;各大平台之间的竞争变得日益激烈。在这样的背景下&#xff0c;汇昌联信科技如何通过有效的策略来提升其在拼多多平台上的店铺浏览量&#xff0c;成为了一个值得深入探讨的问题。提升浏览量不仅能够增加商品的曝光率&#xff0c;还能有效提高…

【设计模式】六大原则-下

❓首先什么是设计模式&#xff1f; &#x1f635;相信刚上大学的你和我一样&#xff0c;在学习这门课的时候根本不了解这些设计原则和模式有什么用处&#xff0c;反而不如隔壁的C更有意思&#xff0c;至少还能弹出一个小黑框&#xff0c;给我个hello world。 ✨ 如何你和我一样…

【python报错】‘XXX‘ object is not callable

‘XXX‘ object is not callable----这个报错通常是因为在代码中某一个变量的名字和函数的名字重复导致的&#xff0c;此时需要确定名称使用是否正确&#xff0c;如果重复则需要修改其中一个名字&#xff1b;如果名字没有问题&#xff0c;那就要看表达式写的对不对&#xff0c;…

使用 Lombok 遇到一个问题

起因是换了一个电脑&#xff0c;重新从服务器上拉了一个项目。项目是由maven构建的&#xff0c;在控制台中使用mvn命令编译项目时&#xff0c;没有任何问题&#xff0c;编译成功。如下图&#xff1a; 可是idea里面的源码&#xff0c;却标红了&#xff0c;如下&#xff1a; 错误…

猫咪掉毛很烦恼,希喂、小米哪个牌子的宠物空气净化器更好用?

随着养宠物人群变多&#xff0c;现在打着宠物专用旗号的空气净化器也越来越多&#xff0c;但是很多空气净化器对宠物的效果&#xff0c;真的是只有宣传上和宠物有关&#xff0c;实际设计和效果上和宠物毫无关系。需要大家擦亮眼睛&#xff0c;多做功课&#xff0c;才能不被那些…

如何在前端测试中,在F12中加入token

不止是token&#xff0c;cookie中其他的数据也都可以这样 首先打开F12&#xff0c;然后找到Application或者应用程序 然后找到cookie里面双击这里&#xff0c;输入token或者其他数据就可以了&#xff0c;后面输值。