linux学习(等待+进程替换初识)[9]

news2025/1/22 12:45:29

阻塞等待

一般在内核中阻塞(伴随着被切换),等待被唤醒(放在等待队列【一种数据结构】中)
在Linux中,阻塞等待是指一个进程或线程被暂停执行,直到某个条件满足或事件发生。下面介绍两种常见的阻塞等待方式:

  1. 阻塞等待系统调用:在Linux中,许多系统调用函数可以使进程或线程进入阻塞等待状态,直到某个条件满足。例如,常见的阻塞等待系统调用包括:

    • read():从文件描述符中读取数据,如果没有数据可读,则进程会阻塞等待,直到有数据可读或出现错误。
    • write():向文件描述符中写入数据,如果写入的缓冲区已满,则进程会阻塞等待,直到有空间可写或出现错误。
    • sleep():使进程休眠指定的时间,进程会阻塞等待,直到休眠时间结束。
    • wait():等待子进程结束,进程会阻塞等待,直到子进程结束或出现错误。

    当条件满足时,阻塞等待的系统调用会返回,并使进程或线程继续执行。

  2. 阻塞等待同步原语:除了系统调用外,Linux还提供了一些同步原语,用于实现线程之间的阻塞等待。这些同步原语包括:

    • 互斥锁(Mutex):线程可以使用互斥锁来保护共享资源,当一个线程持有互斥锁时,其他线程尝试获取锁会被阻塞等待,直到锁被释放。
    • 条件变量(Condition Variable):线程可以使用条件变量来等待某个条件满足,当条件不满足时,线程会阻塞等待在条件变量上,直到其他线程发出条件满足的信号。
    • 信号量(Semaphore):线程可以使用信号量来控制对共享资源的访问,当信号量的值为0时,线程会阻塞等待,直到信号量的值大于0。

    这些同步原语可以帮助线程进行有效的互斥和同步,并实现线程之间的阻塞等待。

非阻塞等待

非阻塞等待是指进程或线程在等待某个条件满足时,不会被暂停执行,而是继续执行其他任务。在Linux中,非阻塞等待通常使用以下两种方式实现:

  1. 轮询:进程或线程可以通过轮询的方式来检查条件是否满足。它会反复地检查条件,如果条件满足,则继续执行相应的操作;如果条件不满足,则继续轮询或执行其他任务。轮询可以使用循环结构实现,例如使用while循环。

    以下是一个简单的示例,展示了如何使用轮询实现非阻塞等待:

    while (!condition) {
        // 执行其他任务
    }
    // 条件满足,执行相应的操作
    

    轮询的优点是简单直接,但它可能会消耗大量的CPU资源,并且可能导致延迟。

  2. 异步事件处理:进程或线程可以将等待任务交给操作系统或其他模块处理,并在条件满足时通过回调函数或事件通知方式得到通知。这样,进程或线程可以继续执行其他任务,而不需要主动轮询。

    异步事件处理通常涉及使用特定的API或框架,例如Linux中的epollselectpoll等系统调用,或者使用异步编程框架,例如libevent、Boost.Asio等。

    以下是一个简单的示例,展示了如何使用异步事件处理实现非阻塞等待:

    // 创建事件循环
    event_loop = create_event_loop();
    
    // 注册事件处理函数
    register_event_handler(event_loop, event_type, event_handler);
    
    // 启动事件循环
    run_event_loop(event_loop);
    

    当事件发生时,事件处理函数 event_handler 将被调用,进程或线程可以在事件处理函数中执行相应的操作。

    异步事件处理的优点是可以提高系统的性能和响应性,但它通常需要更复杂的编程模型和代码结构。

非阻塞等待在处理异步任务和事件驱动编程中非常常见,它可以提高系统的并发性和吞吐量。具体使用哪种非阻塞等待方式取决于您的需求和场景。如果您有特定的问题或需求,请提供更多详细信息,我将尽力提供帮助。
在这里插入图片描述
在这里插入图片描述

进程替换

替换原理

内核结构没有变,并没有创建新的进程
在这里插入图片描述
在这里插入图片描述
如何理解将程序放入内存当中:加载!exec*系列函数
在这里插入图片描述
可变参数列表最后一个参数必须是NIULL,标识参数传递完毕!
在这里插入图片描述

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

int main()
{
    extern char **environ;
    pid_t id = fork();
    if(id == 0)
    {
        //child
        printf("我是子进程: %d\n", getpid());
        //execl: 如果替换成功,不会有返回值,如果替换失败,一定有返回值 ==》如果失败了,必定返回 ==》 只要有返回值,就失败了
        //不用对该函数进行返回值判断,只要继续向后运行一定是失败的!
        //execl("/bin/ls", "ls", "-a", "-ln", NULL); //lsssss: 不存在
        //char *const myargv[] = {
        //    "ls",
        //    "-a",
        //    "-l",
        //    "-n",
        //    NULL
        //};
        //execv("/bin/ls", myargv); //lsssss: 不存在
        //execlp("ls", "ls", "-a", "-l", "-n", NULL);
        //execvp("ls", myargv);
        //char *const myenv[] = {
        //    "MYENV=YouCanSeeMe",
        //    NULL
        //};
        //putenv("MYENV=YouCanSeeMe");
        //execle("./exec/otherproc", "otherproc", NULL, environ);
        //execl("./exec/shell.sh", "shell.sh", NULL);
        execl("./exec/test.py", "test.py", NULL);
        exit(1);
    }

    sleep(1);
    //father
    int status = 0;
    printf("我是父进程: %d\n", getpid());
    waitpid(id, &status, 0);
    printf("child exit code: %d\n", WEXITSTATUS(status));

    return 0;
}

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

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

相关文章

C++学习——string类的模拟实现

目录 string类的创建 string类的构造函数 itertor迭代器 []操作符重载 字符串修改函数 1.尾插函数 2.append函数 3.运算符重载函数 4.clear函数 5.swap函数 容量检测或修改函数 resize函数 reserve函数 经过上一次的博客之后我们已经认识了string类&#xff0c;并且可以使用str…

【C++从0到王者】第二十一站:继承

文章目录 前言一、继承的概念及定义1. 继承的概念2.继承的格式3.继承关系与访问限定符 二、基类和派生类的赋值转换三、继承中的作用域四、派生类的默认成员函数五、继承与友元六、继承与静态成员 前言 继承是面向对象的三大特性之一。我们常常会遇到这样的情况。很多角色的信…

显卡nvidia-smi后 提示Faild 解决过程,包含卸载重装NVIDIA驱动步骤

显卡异常: 显卡nvidia-smi后 提示Faild 解决过程&#xff0c;卸载重装nvidia驱动步骤 文章目录 显卡异常: 显卡nvidia-smi后 提示Faild 解决过程&#xff0c;卸载重装nvidia驱动步骤 [toc]1 缘由2 解决过程3 过程所需命令4 解决4.1 把该显卡重新拔插一下卸载NVIDIA驱动的方法&a…

远程遥控IPTables进行端口复用

一、配置&#xff08;通过ip进行ping&#xff09; 1.创建复用链 iptables -t nat -N LETMEIN 2.创建端口复用将流量转发到22端口上 iptables -t nat -A LETMEIN -p tcp -j REDIRECT --to-port 22 3.开启开关&#xff0c;如果接收到一个长为 1139 的 ICMP 包&#xff0c;则将…

Ajax及前端工程化

Ajax&#xff1a;异步的js与xml。 作用&#xff1a; 1、通过ajax给服务器发送数据&#xff0c;并获得其响应的数据。 2、可以在不更新整个网页的情况下&#xff0c;与服务器交换数据并更新部分网页的技术。 一、同步与异步 二、原生Ajax 1、准备数据地址 2、创建XMLHttpReq…

图神经网络 day2 图的分类

图神经网络基础算法 1 GCN2 GraphSAGE2.1 采样&#xff1a;采样固定长度的邻居2.2 聚合2.3 GraphSAGE_minibatch2.4 GraphSAGE_embedding 3 GAT4. 图网络的分类4.1 递归图神经网络 RGNN4.2 图卷积神经网络GCN4.3 图注意力网络 GAT4.4 图自动编码 GAE4.5 图时空网络 GSTN4.6 图生…

echarts 柱状图-折线图-饼图的基础使用

上图示例图表展示相关配置&#xff1a; var myChart echarts.init(this.$refs.firstMain);myChart.setOption({legend: { // 图例设置top: "15%",type: "scroll",orient: "vertical",//图例列表的布局朝向。left: "right",pageIconCo…

【Docker】 Docker-Composite 启动 WordPress

引 本文将使用流行的博客搭建工具 WordPress 搭建一个私人博客站点。部署过程中使用到了 Docker 、MySQL 。站点搭建完成后经行了发布文章的体验。 WordPress WordPress 是一个广泛使用的开源内容管理系统&#xff08;CMS&#xff09;&#xff0c;用于构建和管理网站、博客和…

ChatGPT​保密吗?它有哪些潜在风险?如何规避?

自2022年11月公开发布以来&#xff0c;ChatGPT已成为许多企业和个人的必备工具&#xff0c;但随着该技术越来越多地融入我们的日常生活&#xff0c;人们很自然地想知道&#xff1a;ChatGPT是否是保密的。 问&#xff1a;ChatGPT保密吗&#xff1f; 答&#xff1a;否&#xff0…

MIUI免费字体更换

一、打开主题壁纸 二、选择 热销字 三、点击右上角 搜索 四、输入 字体 可以看到&#xff0c;免费的字体没多少&#xff0c;此时这里可以输入其他关键词&#xff1a;拼音、手写等&#xff0c;看个人需求进行筛选免费即可 关键词有以下这些&#xff0c;但不局限这些哈 五、点击…

linux系统服务学习(六)FTP服务学习

文章目录 FTP、NFS、SAMBA系统服务一、FTP服务概述1、FTP服务介绍2、FTP服务的客户端工具3、FTP的两种运行模式&#xff08;了解&#xff09;☆ 主动模式☆ 被动模式 4、搭建FTP服务&#xff08;重要&#xff09;5、FTP的配置文件详解&#xff08;重要&#xff09; 二、FTP任务…

共读《科研论文配图绘制指南--基于Python》学习重点

Book 《科研论文配图绘制指南–基于Python》 特别提示 学习内容&#xff08;书籍前3章&#xff09;开营时在群内以PDF形式发放 课程背景 系统地介绍基于Python的科研论文配图的绘制技巧&#xff0c;提高科研工作者的绘图效率&#xff1b; 100多种图形的详细绘制方法&#…

STM32F103-OLED使用教程

目录 1. OLED屏介绍2. OLED如何显示一个点3. 配置OLED屏幕4. OLED显示字符串和汉字5. OLED屏幕显示图片6. 总结 1. OLED屏介绍 OLED&#xff08;Organic Light Emitting Diode&#xff09;&#xff1a;有机发光二极管OLED显示屏&#xff1a;性能优异的新型显示屏&#xff0c;具…

Vue组件(详解)

目录 组件&#xff1a; 全局组件&#xff1a; 在HTML页面声明template&#xff1a; 局部组件&#xff1a; 局部组件第一种方式&#xff1a; 局部组件第二种方式&#xff1a; 插槽slot&#xff1a; 匿名插槽&#xff1a; 具名插槽&#xff1a; 父子组件通信&#xff1…

【双指针_和为 s 的两个数_C++】

和为s的两个数字 class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {int n nums.size();int left 0;int right n-1;while(left<right){if(nums[left]nums[right]>target) right--;else if(nums[left]nums[right]<tar…

Postman接口自动化测试实例

一.实例背景 在实际业务中&#xff0c;经常会出现让用户输入用户密码进行验证的场景。而为了安全&#xff0c;一般都会先请求后台服务器获取一个随机数做为盐值&#xff0c;然后将盐值和用户输入的密码通过前端的加密算法生成加密后串传给后台服务器&#xff0c;后台服务器接到…

车载以太网物理层

车载以太网物理层 O S I 参考模型的第 1 层&#xff08; 最底层&#xff09;。负责逻辑信号&#xff08; 比特流&#xff09;与物理信号&#xff08;电信号、光信号&#xff09;之间的互相转换&#xff0c;通过传输介质为数据链路层提供物理连接。 车载以太网与传统以太网相比…

matlab使用教程(16)—图论中图的定义与修改

1.修改现有图的节点和边 此示例演示如何使用 addedge 、 rmedge 、 addnode 、 rmnode 、 findedge 、 findnode 及 subgraph 函数访问和修改 graph 或 digraph 对象中的节点和/或边。 1.1 添加节点 创建一个包含四个节点和四条边的图。s 和 t 中的对应元素用于指定每条…

【教程】零成本将小米净化器改造为无叶风扇

某宝某多上&#xff0c;就这么点破塑料&#xff0c;就要买79&#xff1f;&#xff01;&#xff01; 我这枚韭菜可不上当。咱自己做一个&#xff01; 真香~

BBS项目day02、注册、登录(登录之随机验证码)、修改密码、退出登录、密码加密加盐

一、注册 1.注册之前端页面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>注册页面</title><!--动态引入文件-->{% load static %}<script src"{% static js/jquery.min.js %…