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,一经查实,立即删除!

相关文章

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

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

vivado ip manager cache

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

07- OpenCV:模糊图像

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

问CHATawsec2怎么部署实例?

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

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

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

Elasticsearch倒排索引详解

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

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

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

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

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

order by 与 分页 的冲突

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

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

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

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

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

ChatGLM3-6B的本地api调用

ChatGLM3-6B的本地api调用方式 1.运行openai_api_demo路径下的openai_api.py 启动后界面: 注意:本地api调到的前提是——本地部署了ChatGLM3-6B,本地部署的教程可参考: 20分钟部署ChatGLM3-6B 部署了若CUDA可用,默认会以CUDA方…

阿里云OSS上传视频,可分片上传

uniappH5实现 阿里云OSS上传视频 示例图: 上传视频完整示例代码: 使用npm安装SDK开发包,安装命令为 npm install ali-oss --save accessKeyId 和 accessKeySecret 还有 bucket 替换成你的就行。 multipartUpload 的第一个入参是&#x…

【分享贴】大话ESD和浪涌

从事电子产品开发的朋友应该都知道,电子产品样机完成之后,会进入产品性能测试阶段,而其中的EMC(电磁兼容)测试则是至关重要的一项。 EMC(电磁兼容)又被分为两大类:EMI(电…

果然程序员的世界不是 0 就是 1

在一场轰动全球的爱情故事中,OpenAI 的首席执行官、同时也是打破常规的浪漫英雄,奥特曼,与他的基友奥利弗穆尔赫林在夏威夷举行了一场迷人的婚礼。在奥特曼的岛屿别墅附近,这对低调却又令人羡慕的新人,在奥特曼的哥哥杰…

webpack执行流程知识点总结

webpack的运行流程 Webpack 的运行流程是一个串行的过程,从启动到结束会依次执行以下流程: 在以上过程中,Webpack 会在特定的时间点广播出特定的事件,插件在监听到感兴趣的事件后会执行特定的逻辑,并且插件可以调用 We…

JAVA毕业设计120—基于Java+Springboot+vue+uniapp的智能小程序商城管理系统(源代码+数据库+15000字论文)

毕设所有选题: https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvueuniapp的智能小程序商城管理系统(源代码数据库15000字论文)120 一、系统介绍 本项目前后端分离,分为用户、商家、管理员三种角色 1、用户&#…

redis stream restTemplate消息监听队列框架搭建

整体思路 1. pom增加redis依赖&#xff1b; 2. 消息监听器&#xff0c;实现StreamListener接口&#xff0c;处理消息到达逻辑&#xff1b; 3. 将消息订阅bean及监听器注册到配置中&#xff1b; 1. pom <?xml version"1.0" encoding"UTF-8"?> <…

Modern C++ std::mutex底层原理

前言 我时常有这样的疑问&#xff1a; std::mutex怎么就能保证后面的语句100%安全哪&#xff1f;CPU reordering就不会把这些语句重排到mutex前面执行&#xff1f;而且各个CPU都是有L1、L2缓存的&#xff0c;如果mutex后面要访问的的变量在这些缓存中怎么办&#xff1f; 带着…

C++ 类 对象

C 在 C 语言的基础上增加了面向对象编程&#xff0c;C 支持面向对象程序设计。类是 C 的核心特性&#xff0c;通常被称为用户定义的类型。 类用于指定对象的形式&#xff0c;是一种用户自定义的数据类型&#xff0c;它是一种封装了数据和函数的组合。类中的数据称为成员变量&a…