
Linux系统
文章平均质量分 87
本专栏用于记录Linux相关的博客
小馬佩德罗
业精于勤荒于嬉,行成于思毁于随
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Linux系统 - 能力
进程只能将其许可能力集中的能力上升到有效集中。(上升有时候也被称为添加或设置,与之相反的操作是丢弃或删除或清除。转载 2025-06-19 23:20:27 · 72 阅读 · 0 评论 -
Linux系统 -文件加锁
应用程序的一个常见需求是从一个文件中读取一些数据,修改这些数据,然后将这些数据写回文件。只要在一个时刻只有一个进程以这种方式使用文件就不会存在问题,但当多个进程同时更新一个文件时问题就出现了。假设各个进程按照下面的顺序来更新一个包含了一个序号的文件。从文件中读取序号。使用这个序号完成应用程序定义的任务。递增这个序号并将其写回文件。这里存在的问题是两个进程在没有采用任何同步技术的情况下可能会同时执行上面的步骤,从而导致(举例)出现图中给出的结果(这里假设序号的初始值为 1000)。转载 2025-06-17 14:06:08 · 91 阅读 · 0 评论 -
Linux系统 - 信号 -3- 高级特性
基于和。转载 2025-06-16 14:53:17 · 91 阅读 · 0 评论 -
Linux系统 - 信号 -2- 信号处理器函数
所以,如果在信号处理器函数中调用了 printf(),而主程序又在调用 printf()或其他 stdio 函数期间遭到了处理器函数的中断,那么有时就会看到奇怪的输出,甚至导致程序崩溃或者数据的损坏。内核 2.6.24 之前,poll()也曾存在这种行为,2.6.22 之前的 sem_wait()、sem_timedwait()、futex(FUTEX_WAIT),2.6.9 之前的 msgrcv()和 msgsnd(),以及 Linux 2.4 及其之前的 nanosleep()也同样如此。转载 2025-06-13 16:14:02 · 72 阅读 · 0 评论 -
Linux系统 - 信号 -1- 基础
信号是事件发生时对进程的通知机制。有时也称之为软件中断。信号与硬件中断的相似之处在于打断了程序执行的正常流程,大多数情况下,无法预测信号到达的精确时间。一个(具有合适权限的)进程能够向另一进程发送信号。信号的这一用法可作为一种同步技术,甚至是进程间通信(IPC)的原始形式。进程也可以向自身发送信号。然而,发往进程的诸多信号,通常都是源于内核。引发内核为进程产生信号的各类事件如下。硬件发生异常,即硬件检测到一个错误条件并通知内核,随即再由内核发送相应信号给相关进程。转载 2025-06-12 11:41:16 · 85 阅读 · 0 评论 -
Linux系统 - 进程 -10- 编写安全的特权程序
特权程序能够访问普通用户无法访问的特性和资源(文件设备等)。一个程序可以通过下面两种方式以特权方式运行。y 程序在一个特权用户 ID 下启动,很多 daemon 和网络服务器通常以 root 身份运行,它们就属于这种类别。y 程序设置了 set-user-ID 或 set-group-ID 权限位。当一个 set-user-ID(set-group-ID)程序被执行之后,它会将进程的有效用户(组)ID 修改为与程序文件的所有者(组)一样的 ID。转载 2025-06-10 16:57:21 · 36 阅读 · 0 评论 -
Linux系统 - 进程 -9- DAEMON
daemon 是一种具备下列特征的进程。它的生命周期很长。通常,一个 daemon 会在系统启动的时候被创建并一直运行直至系统被关闭。它在后台运行并且不拥有控制终端。控制终端的缺失确保了内核永远不会为 daemon自动生成任何任务控制信号以及终端相关的信号(如 SIGINT、SIGTSTP 和 SIGHUP)。daemon 是用来执行特殊任务的,如下面的示例所示。cron:一个在规定时间执行命令的 daemon。转载 2025-06-10 16:37:21 · 62 阅读 · 0 评论 -
Linux系统 - 进程 -8- 进程资源
每个进程都会消耗诸如内存和 CPU 时间之类的系统资源。本文关于资源相关的一些系统调用。转载 2025-06-10 14:53:07 · 42 阅读 · 0 评论 -
Linux系统 - 进程 -7- 进程优先级和调度
在一个系统上一般会同时运行交互式进程和后台进程,标准的内核调度算法一般能够为这些进程提供足够的性能和响应度。但实时应用对调度器有更加严格的要求,如下所示。实时应用必须要为外部输入提供担保最大响应时间。在很多情况下,这些担保最大响应时间必须非常短(如低于秒级)。如交通导航系统的慢速响应可能会是一个灾难。为了满足这种要求,内核必须要提供工具让高优先级进程能快速地取得 CPU 的控制权,抢占当前运行的所有进程。高优先级进程应该能够保持互斥地访问 CPU 直至它完成或自动释放 CPU。转载 2025-06-10 13:58:28 · 91 阅读 · 0 评论 -
Linux系统 - 线程 -5- 更多细节
创建线程时,每个线程都有一个属于自己的线程栈,且大小固定。。(在一些 64 位架构下,默认尺寸要大一些,例如,IA-64 有 32MB。。偶尔,也需要改变线程栈的大小。在通过线程属性对象创建线程时,调用函数 pthread_attr_setstacksize() 所设置的线程属性决定了线程栈的大小。而使用与之相关的另一函数 pthread_attr_setstack(),可以同时控制线程栈的大小和位置,不过设置栈的地址将降低程序的可移植性。转载 2025-06-09 15:19:41 · 39 阅读 · 0 评论 -
Linux系统 - 线程 -4- 线程取消
SUSv3 规定,实现若提供了下表中所列的函数,则这些函数必须是取消点。其中的大部分函数都有能力将线程无限期地堵塞起来。除表所列函数之外,SUSv3 还指定了大量函数,系统实现可以将其定义为取消点。其中包括 stdio 函数、dlopen API、syslog API、nftw()、popen()、semop()、unlink(),以及从诸如 utmp 之类的系统文件中获取信息的各种函数。转载 2025-06-08 21:28:59 · 63 阅读 · 0 评论 -
Linux系统 - 线程 -6- 线程安全函数和可重入函数
线程安全函数是指在多线程环境中可以被多个线程同时调用而不会导致数据竞争或其他并发问题的函数。原创 2025-06-07 14:52:28 · 340 阅读 · 0 评论 -
Linux系统 - 线程 -3- 线程安全和每线程存储
要使用线程特有数据,库函数执行的一般步骤如下。函数创建一个键(key),用以将不同函数使用的线程特有数据项区分开来。调用函数pthread_key_create()可创建此“键”,且只需在首个调用该函数的线程中创建一次,函数pthread_once()的使用正是出于这一目的。键在创建时并未分配任何线程特有数据块。调用 pthread_key_create()还有另一个目的,即允许调用者指定一个自定义解构函数,用于释放为该键所分配的各个存储块(参见下一步)。转载 2025-06-07 20:59:59 · 49 阅读 · 0 评论 -
Linux系统 - 线程 -2- 线程同步
线程用来同步彼此行为的两个工具:互斥量可以帮助线程同步对共享资源的使用,以防如下情况发生:线程甲试图访问一共享变量时,线程乙正在对其进行修改。条件变量则是在此之外的辅助补充,允许线程相互通知共享变量(或其他共享资源)的状态发生了变化。线程的主要优势在于,能够通过全局变量来共享信息。不过,这种便捷的共享是有代价的:必须确保多个线程不会同时修改同一变量,或者某一线程不会读取正由其他线程修改的变量。术语临界区(critical section)是指访问某一共享资源的代码片段,并且这段代码的执行应为原子(atomi转载 2025-06-06 22:00:00 · 35 阅读 · 0 评论 -
Linux系统 - 线程 -1- 线程基础
(因为左值可以修改,多线程程序依然能以 errno=value 的方式对 errno 赋值。)一言以蔽之,errno 机制在保留传统 UNIX API 报错方式的同时,也适应了多线程环境。转载 2025-06-05 20:30:00 · 39 阅读 · 0 评论 -
Linux系统 - 进程 -6- 进程创建和程序执行的细节问题
打开进程记账功能后,。这条账单记录包含了内核为该进程所维护的多种信息,包括终止状态以及进程消耗的CPU 时间。具体使用时再研究…转载 2025-06-04 22:12:39 · 26 阅读 · 0 评论 -
Linux系统 - 进程 -5- 程序的执行
调用 execve()之后,因为同一进程依然存在,所以进程 ID 仍保持不变。尤其是在特权进程中调用 exec()来启动一个未知程序时(并非自己编写),亦或是启动程序并不需要使用这些已打开的文件描述符时,从安全编程的角度出发,应当在加载新程序之前确保关闭那些不必要的文件描述符。无论是否更改了有效 ID,也不管这一变化是否生效,execve()都会以进程的有效用户 ID 去覆盖已保存的(saved)set-user-ID,以进程的有效组 ID 去覆盖已保存的(saved)set-group-ID。转载 2025-06-04 22:12:03 · 43 阅读 · 0 评论 -
Linux系统 - 进程 -4- 监控子进程
在很多应用程序的设计中,父进程需要知道其某个子进程于何时改变了状态——子进程终止或因收到信号而停止。转载 2025-06-04 22:11:19 · 73 阅读 · 0 评论 -
Linux系统 - 进程 -3- 进程的终止
通常,进程有两种终止方式。其一为异常(abnormal)终止,如由对一信号的接收而引发,该信号的默认动作为终止当前进程,可能产生核心转储(core dump)。此外,进程可使用_exit()系统调用正常(normally)终止。_exit()的 status 参数定义了进程的终止状态(termination status),父进程可调用 wait()以获取该状态。虽然将其定义为 int 类型,但仅有低 8 位可为父进程所用。按照惯例,终止状态为 0 表示进程“功成身退”,而非 0 值则表示进程因异常而退出转载 2025-06-04 22:10:43 · 32 阅读 · 0 评论 -
Linux系统 - 进程 -2- 进程的创建
fork()、exit()、wait()以及 execve()这几个系统调用都各有变体。先对这 4 个系统调用及其典型用法简单加以介绍。下图对 fork()、exit()、wait()以及 exece()之间的相互协同作了总结。图中对 execve()的调用并非必须。有时,让子进程继续执行与父进程相同的程序反而会有妙用。最终,两种情况殊途同归:总是要通过调用 exit()(或接收一个信号)来终止子进程,而父进程可调用 wait()来获取其终止状态。同样,对 wait()的调用也属于可选项。转载 2025-06-04 21:30:00 · 23 阅读 · 0 评论 -
Linux系统 - 进程 -1- 进程基础
程序是包含了一系列信息的文件,这些信息描述了如何在运行时创建一个进程,所包括的内容如下所示。转载 2025-05-30 21:00:00 · 37 阅读 · 0 评论 -
Linux系统 - 文件I/O - 缓冲
下图概括了 stdio 函数库和内核所采用的缓冲(针对输出文件),以及对各种缓冲类型的控制机制。从图中自上而下,首先是通过 stdio 库将用户数据传递到 stdio 缓冲区,该缓冲区位于用户态内存区。当缓冲区填满时,stdio 库会调用 write()系统调用,将数据传递到内核高速缓冲区(位于内核态内存区)。最终,内核发起磁盘操作,将数据传递到磁盘。图左侧所示为可于任何时刻显式强制刷新各类缓冲区的调用。转载 2025-05-29 16:10:30 · 74 阅读 · 0 评论 -
Linux系统 - 文件I/O - 深入的问题
在探究系统调用时会反复涉及原子操作的概念。所有系统调用都是以原子操作方式执行的。之所以这么说,是指内核保证了某系统调用中的所有步骤会作为独立操作而一次性加以执行,其间不会为其他进程或线程所中断。原子性是某些操作得以圆满成功的关键所在。特别是它规避了竞争状态。竞争状态是这样一种情形:操作共享资源的两个进程(或线程),其结果取决于一个无法预期的顺序,即这些进程1获得 CPU 使用权的先后相对顺序。将讨论涉及文件 I/O 的两种竞争状态,并展示了如何使用 open()的标志位,来保证相关文件操作的原子性,从而转载 2025-05-28 21:22:03 · 48 阅读 · 0 评论 -
Linux系统 - 文件I/O - 通用I/O模型
所有执行 I/O 操作的系统调用都以文件描述符,一个非负整数(通常是小整数),来指代打开的文件。文件描述符用以表示所有类型的已打开文件,包括管道(pipe)、FIFO、socket、终端、设备和普通文件。针对每个进程,文件描述符都自成一套。按照惯例,大多数程序都期望能够使用 3 种标准的文件描述符。在程序开始运行之前,shell 代表程序打开这 3 个文件描述符。更确切地说,程序继承了 shell 文件描述符的副本——在 shell 的日常操作中,这 3 个文件描述符始终是打开的。转载 2025-05-28 08:19:14 · 69 阅读 · 0 评论 -
Linux系统 - 系统编程概念
系统调用是,借助于这一机制,进程可以请求内核以自己的名义去执行某些动作。以应用程序编程接口(API)的形式,内核提供有一系列服务供程序访问。这包括创建新进程、执行 I/O,以及为进程间通信创建管道等。。为说明这点,下面以一个具体的硬件平台—x86-32 为例,按事件发生的顺序对这些步骤加以分析。外壳(wrapper)函数下图以系统调用 execve()为例,展示了上文述及事件的发生序列。在 Linux/x86-32 上,execve()的系统调用号为 11(__NR_execve)。原创 2025-05-27 21:00:00 · 764 阅读 · 0 评论 -
Linux系统 - 基本概念
介绍一些Linux系统的基本概念。原创 2025-05-27 11:16:12 · 855 阅读 · 0 评论 -
Linux中安装samba服务
通过以上步骤,你就可以在Linux服务器上成功安装和配置Samba服务,实现文件共享功能。为了访问Samba共享,需要创建一个Samba用户。安装完成后,需要对Samba进行配置。Samba的主配置文件是。首先,创建一个用于共享的目录,例如。原创 2025-05-15 16:00:59 · 457 阅读 · 0 评论 -
如何为Linux/Android Kernel 5.4和5.15添加 fuse passthrough透传功能 ?
参考:Google文档参考此文档,目前kernel.org提供的fuse passthrough补丁在6.9版本之后,但想要在5.4和5.15版本内核做移植应该如何简单点呢?文档中提到 Android的内核为5.4 和 5.15版本内核做了fuse passthrough功能,可以参考Android提供的内核版本来修改对应kernel.org发布的版本。(本文提供一个思路)原创 2025-04-03 10:27:37 · 615 阅读 · 0 评论 -
将本地代码从一台GitLab服务器上迁移到另外一台新的Gitlib服务器
我把南京Gitlab服务器迁移至深圳Gitlab服务器,此篇来记录下。原创 2020-08-17 15:07:26 · 5879 阅读 · 0 评论 -
Linux系统中 ssh 连接其他服务器一段时间后卡死问题
在Ubuntu下经常需要通过SSH进行远程连接,使用过程中往往会遇到一个问题,就是命令行窗口在经过一段时间后就会卡死,无法输入命令。原创 2023-07-18 11:08:33 · 3359 阅读 · 3 评论 -
在windows系统中映射网络驱动器时,如何通过非455端口远程访问Linux服务器的Samba服务
右键 电脑–管理–服务和应用程序–服务,找到名为Server的服务,双击打开属性,启动类型改为禁用。在映射网络驱动器时,填入127.0.0.1即可映射至Linux服务器的Samba服务。是 pid 为 4 的进程进行监听。原创 2023-06-27 16:44:46 · 3043 阅读 · 17 评论 -
git clone 所有分支到本地的方法
1. 克隆仓库,默认克隆下来的是master$ git clone https://github.com/PX4/PX4-ECL.gitCloning into 'PX4-ECL'...remote: Enumerating objects: 10932, done.remote: Counting objects: 100% (370/370), done.remote: Compressing objects: 100% (180/180), done.remote: Total 10932原创 2022-03-03 15:35:40 · 2387 阅读 · 0 评论 -
MobaXterm远程SSH连接经常中断/让MobaXterm实现多实例同时运行
在使用MobaXterm的ssh服务连接远程服务器(如Linux)时,在一段无操作时间,系统会自动断开连接的问题。通过以下简单设置,可以解决无操作断连问题。1、打开MobaXterm的设置界面:2、点击 SSH keepalive 即可...原创 2020-08-07 13:43:36 · 7981 阅读 · 1 评论 -
在Linux系统中实现端口转发
1.实现步骤安装rinetd工具sudo apt install rinetd修改配置文件:/etc/rinetd.confsudo vim /etc/rinetd.conf#bindaddress bindport connectaddress connectport#绑定的地址 绑定的端口 转发的地址 转发的端口#将所有发往本机的2019端口的请求转发到本机的2020端口1.1.1.1 2019 2.2.2.2 2020启动命令/usr/sbin/rinet原创 2020-06-02 14:00:17 · 8770 阅读 · 0 评论 -
Ubuntu系统手动从14.4升级到18.4的方法
声明用了好久的ubuntu14.04系统,有点审美疲劳的感觉,突然想升级18.4看看,于是有了这篇。1.查看当前系统版本lsb_release -a2.执行更新操作sudo apt-get updatesudo apt-get upgradesudo apt-get dist-upgrade3.重启系统reboot4.执行系统升级操作do-release-upgrade...原创 2020-01-08 15:35:36 · 3133 阅读 · 1 评论 -
删掉BeyondCompare 4安装目录里的BCUnrar.dll
将beyond Compare 4安装文件夹下的BCUnrar.dll删掉,重新打开便可以继续使用。原创 2020-09-08 09:49:03 · 666 阅读 · 0 评论 -
Ubuntu18编译内核源码并安装
声明问题来源是公司一台带触摸屏的x86 PAD安装了Ubuntu 18后,其触摸屏和实际屏幕方向是相反的,于是想通过修改Ubuntu 18的内核中的触摸屏驱动来修正;先拿我自己笔记本上的Ubuntu 18系统做个试验;参看:https://blog.youkuaiyun.com/l460133921/article/details/531788751 下载Ubuntu 18 内核源码使用如下命令下载内核源码:sudo apt-cache search linux-sourcesudo apt-ge原创 2020-01-09 09:18:47 · 9172 阅读 · 9 评论