Linux 终端与进程

news2025/1/12 4:05:11

有趣的问题

Linux 中的 终端,控制台,TTY,PTY 究竟是什么?它们与进程有什么关系?

历史回顾:控制台 (Console)

控制台是一个直接控制设备的面板 (属于设备的一部分)

计算机设备的控制台:按键 & 指示灯 (键盘 & 显示器)

早期的电子计算机必然有一个控制台

历史回顾:终端 (Terminal)

终端是一台独立于计算机的机器,是能够和计算机进行交互的设备

TTY -- 即:TeleType Writer 电传打字机,一种终端设备

以前 TTY 是电传打字机;现在 TTY 已经成为一种标准,其他终端想要和计算机进行交互,就需要遵守 TTY 标准

历史发展进程

电传打字机已经淘汰

计算机上的输入设备和显示设备从主机独立出来

控制台与终端的物理表现形式逐渐趋近

计算机开始支持多任务处理

终端与进程

TTY 演变为 Linux 中的抽象概念,对于进程而言 TTY 是一种输入输出设备

用户进程通过系统调用访问 TTY 设备来获取输入、展示输出;而 TTY 设备运行于内核模式,可以与外设进行交互,而外设为了成功的被进程使用,就需要在驱动层面满足 TTY 标准

各种终端类型

Linux 有两种工作界面模式,一种是图形界面模式,使用的终端是伪终端;另一种是 命令行(文本)模式,使用的终端是虚拟终端

内核终端模拟器

伪终端模型

伪终端 (gnome-terminal)

gnome-terminal 是一个进程对接 PTY 主设备,可以操控键盘和显卡,bash 也是一个进程,是 shell 的一种类型,对接 PTY 从设备;主设备发送数据后,从设备可以接收到主设备发送的消息,从设备发送数据后,主设备也可以接收到从设备发送的消息,这是一种进程间通信的方法

当我们在命令行中输入 ls 后,bash 去执行 ls 后得到结果,然后将结果发送给 gnome-terminal,gnome-terminal 接收到结果后,会去操控显卡,在命令行中显示结果,这就是使用图形界面的命令行

我们通过 pstree 来查看图形化界面命令行中的进程树,可以看出图形化界面命令行使用的是伪终端

虚拟终端和伪终端的工作模式有较大的差别。但对于shell 进程而说,虚拟终端和伪终端没什么区别,它们都是 tty 设备

伪终端程序设计 (master)

创建 PTY 主从设备:master = posix_openpt(O_RDWR);

创建主设备权限:

  • grantpt(master);  // 获取设备使用权限
  • unlockpt(master); // 解锁设备,为读写做准备

读写主设备

  • c = read(master, &rx, 1);
  • len = write(master, txbuf, strlen(txbuf));

伪终端程序设计 (slave)

打开 PTY 从设备:slave = open(path_to_slave, O_RDWR);

读写从设备:

  • write(slave, "Delphi\r", 7);
  • read(slave, buf, sizeof(buf) - 1);

思考

终端必然与进程关联才有意义!那么进程之间除了父子关系,是否还有其他关系?

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

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

相关文章

2FSK调制解调VHDL,Quartus

名称:2FSK调制解调VHDL(代码在文末付费下载) 软件:Quartus 语言:VHDL 要求:使用VHDL实现2FSK的调制和解调,并进行仿真 代码下载:2FSK调制解调VHDL,Quartus_Verilog/VHDL资源下载…

C++ stack queue模拟实现

目录 一.stack 二.queue 三.deque STL中有6大组件,我们前面讲的string/vector/list是容器,还有迭代器,以及算法(比如find,swap,reverse,sort,merge函数),仿函…

【Java 基础篇】Java Stream 流详解

Java Stream(流)是Java 8引入的一个强大的新特性,用于处理集合数据。它提供了一种更简洁、更灵活的方式来操作数据,可以大大提高代码的可读性和可维护性。本文将详细介绍Java Stream流的概念、用法和一些常见操作。 什么是Stream…

bootstrapv4轮播图去除两侧阴影及线框的方法

文章目录 前言一、前提条件:二、bootstrap文档组件展示与实际应用1.官方文档展示如下:没有阴影2.实际应用情况如下: 三、解决方案 前言 这篇文章主要介绍了bootstrapv4轮播图去除两侧阴影及线框的方法,本文通过示例代码给大家介绍的非常详细…

基于微信小程序的项目申报管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言用户微信端的主要功能有:管理员的主要功能有:具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉…

【Vue】vue-cli一站式搭建SPA项目

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《Vue快速入门》。🎯🎯 &…

vtk- 数据类型(一) 三角链实例代码

三角链实例代码 #include <iostream> #include <string> #include <regex> #include "tuex.h" #include "vtkCylinderSource.h" #include "vtkPolyDataMapper.h" #include "vtkActor.h" #include "vtkRendere…

Java --- MySQL8数据库优化性能查看工具

目录 一、数据库服务器优化步骤 ​编辑二、查看系统性能的参数 三、统计SQL的查询成本&#xff1a;last_query_cost 四、定位执行慢的SQL&#xff1a;慢日志查询 4.1、开启并设置慢查询日志查询参数 4.2、查看慢查询数目 4.3、慢查询日志分析工具&#xff1a;mysqldumps…

MySQL单表查询和多表查询

一、单表查询 素材&#xff1a; 表名&#xff1a;worker-- 表中字段均为中文&#xff0c;比如 部门号 工资 职工号 参加工作等 CREATE TABLE worker (部门号 int(11) NOT NULL,职工号 int(11) NOT NULL,工作时间 date NOT NULL,工资 float(8,2) NOT NULL,政治面貌 varchar(10)…

帆软FineReport决策报表之页面布局

最近在用帆软决策报表绘制首页大屏&#xff0c;记录使用过程&#xff0c;方便查看。 版本&#xff1a;FineReport10.0 第一步、页面布局 页面布局其实就是组件的排列组合&#xff0c;决策报表主区域body有两种布局方式&#xff1a;自适应布局和绝对布局。 1&#xff09;自适应…

C#中实现单元测试的示例流程_MSTest测试项目

一、单元测试简介 1.1、单元测试简介 在《单元测试艺术》一书中对于单元测试的定义是&#xff1a;【一个单元测试是一段代码&#xff0c;这段代码调用一个工作单元&#xff08;指&#xff1a;调用软件中的一个方法&#xff0c;这个方法执行过程中所发生的所有行为以及最后产生…

你好,python!——python基础中的基础

〇、注释 0.1 单行注释 python中用 “# ”来给某一行注释&#xff0c; 他的快捷键是 CTRL / &#xff0c;当注释内容已被注释时&#xff0c;会解除注释 0.2 多行注释 python中用 """ 注释内容 """ 来对内容进行多行注释 ""&q…

DATE和LocalDateTime在Java中有什么区别

在Java中&#xff0c;Date和LocalDateTime是两个表示日期和时间的类&#xff0c;它们有以下区别&#xff1a; 类型&#xff1a;Date是Java旧版提供的日期和时间类&#xff0c;而LocalDateTime是Java 8引入的新日期和时间API中的类。 不可变性&#xff1a;Date是可变类&#x…

Questasim与Visualizer的livesim仿真

1.前言 Live-Simulation (live-sim)模式允许Visualizer调试环境与Questasim进行交互操作&#xff0c;此模式将Visualizer GUI与Questasim仿真相结合&#xff0c;因此可以在线调试当前仿真的结果和波形。在livesim模式中&#xff0c;可以在Visualizer GUI中控制仿真、设置断点(…

【Java 基础篇】Java 类加载器详解

在Java编程中&#xff0c;类加载器&#xff08;Class Loader&#xff09;是一个重要的概念&#xff0c;它负责将类加载到Java虚拟机中&#xff0c;使程序能够正常运行。本文将详细解释Java类加载器的工作原理、不同类型的类加载器以及如何自定义类加载器。 什么是类加载器&…

智慧公厕以数字技术为中心,融合数字管理技术与城市治理需求精准对接

现代城市的发展离不开科技的进步&#xff0c;智慧公厕作为城市治理的重要方面之一&#xff0c;正逐渐受到越来越多的重视。智慧公厕以数字技术为中心&#xff0c;融合数字管理技术与城市治理需求精准对接&#xff0c;为城市居民提供更加方便、舒适的公共卫生设施。本文将以智慧…

2023年7月嵌入式项目开发专题总汇

一、前言 当前文章总结了28个基于不同单片机&#xff08;51单片机和STM32&#xff09;设计的软件和硬件项目。这些项目涵盖了计算器、手机、酒精检测仪、环境温度与湿度检测设备、考勤系统、门禁照相机、人体健康检测仪、数码相册、太阳能热水器、数显热水器和智能空调等多个领…

高性能计算环境下的深度学习异构集群建设与优化实践

★深度学习&#xff1b;模式识别&#xff1b;图像处理&#xff1b;人工智能建模&#xff1b;人工智能&#xff1b;深度学习算法&#xff1b;强化学习&#xff1b;神经网络&#xff1b;卷积神经网络&#xff1b;人工神经网络&#xff1b;VIBE算法&#xff1b;控制系统仿真&#…

用Redis做数据排名

1.背景 用Redis做数据缓存用的比较多&#xff0c;大家都能熟练使用String和Hash结构去存储数据&#xff0c;今天讲下如何使用ZSet来做数据排名。 假设场景是需要按天存储全国城市的得分数据&#xff0c;可以查询前十名的城市排名。 这个case可以使用传统关系型数据库做…

5-2 Pytorch中的模型层layers

深度学习模型一般由各种模型层组合而成。 torch.nn中内置了非常丰富的各种模型层。它们都属于nn.Module的子类&#xff0c;具备参数管理功能。 例如&#xff1a; nn.Linear, nn.Flatten, nn.Dropout, nn.BatchNorm2d, nn.Embedding nn.Conv2d,nn.AvgPool2d,nn.Conv1d,nn.ConvTr…