UNIX环境编程-进程纪要

进程章节

      • 环境表
      • 关于system调用的安全问题
      • 终端和作业管控
      • 信号
          • sigsuspend函数
      • 守护进程编程规则
      • 多进程问题
      • 多线程问题
      • IO种类
      • 进程通信
      • 终端

环境表

每个程序都有一张环境表。环境表是一个字符指针数组,其中每个指针都包含一个以null
结尾的环境变量字符串。全局变量environ包含了该指针数组的地址:

extern char ** environ;

如下图:
在这里插入图片描述

关于system调用的安全问题

现有两个可执行程序exec1和exec2,exec1的用户ID为root,并且设置了保存用户ID位;exec2的用户ID为普通用户。exec1程序中使用system调用exec2,当通过普通用户权限调用exec1时,exec2会获取到root的权限。

终端和作业管控

终端登录到启动shell的过程,如下:
在这里插入图片描述
会话和进程组,如下:
在这里插入图片描述

注意,进程组组长无法创建一个新的会话,调用setsid函数会失败(假如说进程组可以创建会话,那么会导致新会话成员和进程组原来会话产生了冲突(组员属于原来的会话))。

信号

信号排队:在信号屏蔽期间,如果信号多次被递送到进程,则对于不支持排队的信号来说,只会对信号处理一次;对于支持排队的信号,则会处理多次。

注意,在信号处理程序执行的过程中,也可能被其他信号所打断(但是可以在信号处理程序执行过程中设置信号屏蔽集)

sigsuspend函数

试想有下面一种场景:
1.屏蔽某个信号。
2.执行临界区代码操作。
3.解除信号得屏蔽。
4.等待信号的到来(pause函数)。
由于第3步和第4步不是原子的,则有可能在3、4步之间发生信号的丢失,第4步将永久等待下去。

int sigsuspend(const sigset_t *mask);

sigsuspend函数就是将解除阻塞和等待这2步合并为原子操作。并且在函数返回时恢复之前的信号屏蔽字(mask临时设置信号屏蔽字)。

守护进程编程规则

  1. 设置umask。
  2. fork,父进程exit。
  3. setsid(解除和控制终端的联系)。
  4. 更改工作目录;关闭不必要文件描述符;重定向0、1、2至/dev/null。

多进程问题

  1. 父子进程共享打开的文件描述符。即使在使用了exec系统调用后(当前进程的正文、数据、堆和栈段被替换),父子进程依然共享打开的文件描述符。

多线程问题

  1. 线程可重入函数不等于信号可重入函数。
  2. 递归锁可以避免由于信号处理函数导致的死锁问题。
  3. 每个线程可以设置属于自己的特定的数据(pthread_setspecific)。
  4. 每个线程都有自己的信号屏蔽字,但是所有线程共享信号的处理程序
  5. 在多线程中使用fork时,子进程中只存在一个线程(该线程由父进程中调用fork的线程副本构成)。
  6. 在使用互斥锁时,一个线程对其加锁,另一个线程对其解锁(正常应该是同一个线程加锁、解锁),可能会出现错误。可以封装信号量实现自己的互斥量来支持这种场景。

IO种类

  1. 非阻塞IO,一般会通过轮询的方式来处理这种IO。
  2. 阻塞IO,阻塞等待。
  3. 异步IO,aio_XXX,以aio开头的函数。
  4. 信号驱动IO,利用信号通知(受限制于不同的操作系统是否支持)。
  5. IO复用,select、poll、epoll。

异步IO与信号驱动IO的差别在于:信号驱动IO是内核通知我们何时可以启动一个IO操作;而异步IO是由内核通知我们IO操作何时完成。

IO复用配合非阻塞IO可以在一定程度上提升效率,但是会大大增加编码的难度(需要充分考虑接受数据时缓冲区的问题),使用IO复用配合多线程更好(视情况而定)。

进程通信

  1. 管道,pipe和fifo。
  2. 消息队列(不推荐使用)。
  3. 信号量(同步控制,有XSI风格和POSIX风格两种(又分为多进程使用信号量和单进程使用的信号量,初始化方式不同))。
  4. 共享内存。
  5. mmap(和共享内存类似,区别是mmap需要与文件关联;匿名mmap或是映射了/dev/zero的mmap只可用于父子进程通信)。

终端

  1. 波特率:位/每秒

  2. 终端属性由4个字段标识,配合多种选项,可以组合出无数种终端使用规则。
    在这里插入图片描述

  3. 伪终端,指的是对一个应用程序而言,它看上去像一个终端,但事实上它并不是一个真正的终端。下图展示了典型的使用伪终端的结构(进程1打开伪终端主设备,进程2打开伪终端从设备):
    在这里插入图片描述
    对于上图的进程2来说,它好像就是在读写一个终端设备,而实际上他读写的数据都来自进程1。一个伪终端的案例,rlogind服务器:
    在这里插入图片描述

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

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

相关文章

书客、明基、好视力护眼台灯大比拼,哪款更胜一筹?

在现代生活中,我们经常面对着各种电子屏幕,给眼睛造成了一定的压力,时间一长,会发现眼睛很疲劳。很多家长仔细观察,当孩子长时间处在不合适地灯光下玩耍、学习,会发现他们有揉眼的动作,这就是不…

汽车销售领域相关专业术语

引言 本文是笔者在从事汽车销售领域信息化建设过程,积累的一些专业术语注解,供诸位参考交流。 专业术语清单 4S店   汽车销售服务4S店;是由经销商投资建设,按照汽车生产厂家规定的标准建造,是一种集整车销售(Sale)、零配件(Sparepart)、售后服务(Service)、信息…

vivado ip manager cache

https://china.xilinx.com/video/hardware/configuring-managing-reusable-ip-vivado.html

07- OpenCV:模糊图像

目录 一、模糊原理 二、模糊的相关处理方法: 1、均值滤波(归一化盒子滤波) 2、高斯滤波(正态分布的形状) 3、中值模糊 4、双边模糊算法(美容软件) 5、相关代码: 6、几种模糊算法的比…

如何在 Ubuntu 20.04 上安装 Apache Kafka

前些天发现了一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站。 如何在 Ubuntu 20.04 上安装 Apache Kafka 介绍 Apache Kafka是一种分布式消息代理,旨在处理大量实…

一体机旅游景区污水处理设备工艺说明

一体机旅游景区污水处理设备工艺说明 原水浓度:COD≤500mg/L,BOD≤300mg/L,NH3-N≤40mg/L,超过以上浓度需另行设计。 出水标准:COD≤60mg/L,BOD≤20mg/L,NH3-N≤15mg/L,出水要求如更…

常用Java代码-Java中的异常传播

在Java中,异常传播是一个重要的概念,它描述了异常如何在方法之间传播。当一个方法抛出一个异常时,调用该方法的代码必须处理该异常,否则程序将终止。如果调用该方法的代码也抛出了异常,那么这个异常会继续向上传播&…

问CHATawsec2怎么部署实例?

CHAT回复:在AWS EC2(Elastic Compute Cloud)上部署实例主要涉及以下步骤: 1. 登录AWS管理控制台:使用你的AWS账户登录AWS管理控制台。 2. 导航到EC2服务:在顶部菜单栏中,点击"服务"然…

android——rxjava的使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、rxjava是什么?二、使用步骤 1.引入库2.读入数据总结 前言 本文介绍项目开发中使用到rxjava的情形,以及详细的代码。 一、rxjava是什…

2023年终小结

亲爱的小伙伴们: 随着2023年即将结束,我想回顾一下过去一年作为一名程序员的成长和经验,并分享一些我在技术和团队合作方面的收获。 1. 技术成长与学习: 在过去的一年里,我积极追求技术的学习和发展。我深入研究了新…

Canvas 指南与总结

背景 Canvas API 提供了一个通过 JavaScript 和 HTML 的元素来绘制图形的方式。它可以用于动画、游戏画面、数据可视化、图片编辑以及实时视频处理等方面。 Canvas API 主要聚焦于 2D 图形。而同样使用元素的 WebGL API 则用于绘制硬件加速的 2D 和 3D 图形。 简单例子 <…

运维管理软件:助力大学校园破浪前行的数字引擎

随着校园信息化的深入推进&#xff0c;智慧校园的建设面临着诸多挑战。庞大的IT环境、复杂的网络架构、多样化的应用需求&#xff0c;都对运维管理提出了更高的要求。同时&#xff0c;数据安全、隐私保护以及高效的资源利用也成为智慧校园运维的核心需求。 在这场数字化时代的浪…

本地静态资源打包出来,本地配置ng访问服务器(uniapp打包成h5后,使用打包资源连接测试环境测试)

1.下载ng https://nginx.org/en/download.html 2.解压下载的压缩包 3.打包h5静态资源 4.将打包出来的资源放入ng -》html文件夹下面 5.进入ng-》conf-》nginx.conf 进行转发配置 6.启动ng服务&#xff0c;点击nginx.exe 7.浏览器直接访问http://localhost:8081/#/&#x…

mysql触发器的简单使用

mysql触发器 触发器是一个特殊的存储过程&#xff0c;在事件delete、insert、update发生时自动执行一条或多条SQL语句&#xff08;执行多条SQL语句需要用begin、end 包裹起来&#xff09; 创建触发器 创建触发器的四大必要条件 唯一的触发器名称触发器关联的表触发器响应的…

Elasticsearch倒排索引详解

倒排索引&#xff1a; 组成 term index(词项索引 &#xff0c;存放前后缀指针) Term Dictionary&#xff08;词项字典&#xff0c;所有词项经过文档与处理后按照字典顺序组成的一个字典&#xff08;相关度&#xff09;&#xff09; Posting List&#xff08;倒排表&#xf…

Web实战丨基于Django与HTML的新闻发布系统

文章目录 写在前面项目简介项目框架实验内容安装依赖库1.创建项目2.系统配置3.配置视图文件4.配置模型文件5.配置管理员文件6.配置模板文件7.创建数据库8.启动项目 运行结果写在后面 写在前面 本期内容&#xff1a;基于Django与HTML的简单新闻发布系统。 项目需求&#xff1a…

快速入门Semantic Kernel:构建您的第一个AI应用

快速入门Semantic Kernel&#xff1a;构建您的第一个AI应用 引言Semantic Kernel基础知识核心功能操作原理 环境准备和安装环境准备安装Semantic Kernel 创建第一个Semantic Kernel项目项目设置示例代码测试和运行 设计有效的Prompt基本原则示例测试和迭代 常见问题和解决方案问…

order by 与 分页 的冲突

order by 与 分页 的冲突 问题背景 Oracle拼接SQL&#xff0c;JAVA使用SQLQueryExecutor执行拼接的SQL&#xff0c;SQL如下&#xff1a; SELECT col_key, col_other_info FROM tb_tableName WHERE col_where_info 一些筛选条件 order by col_updatetime desc 该表中的数…

python股票分析挖掘预测技术指标知识跳空缺口指标详解(5)

本人股市多年的老韭菜&#xff0c;各种股票分析书籍&#xff0c;技术指标书籍阅历无数&#xff0c;萌发想法&#xff0c;何不自己开发个股票预测分析软件&#xff0c;选择python因为够强大&#xff0c;它提供了很多高效便捷的数据分析工具包。 我们已经初步的接触与学习其中数…

cad的模型怎么打散导入3d---模大狮模型网

将CAD中的模型打散并导入3D建模软件&#xff0c;需要以下步骤&#xff1a; 将CAD中的模型进行分组或分层&#xff1a;在CAD中&#xff0c;将模型按照不同的组或层进行分组或分层。这样可以方便地控制每个部分的显示和隐藏&#xff0c;在导入3D建模软件后&#xff0c;也可以更方…