
Linux
文章平均质量分 80
致守
这个作者很懒,什么都没留下…
展开
-
ssh执行远程命令的坑
既然是终端分配导致的,那么根据ssh -T参数的含义,是否可以disable伪终端的分配呢?可以进行试验,执行如下命令。登入shell终端,手动执行上面的命令,一切ok。但是放到crontab中无法执行,重定向输出到文件,得到如下信息。直接在终端里执行shell命令,与crontab里执行,本质区别是二者环境变量的差异。使用 ssh -t -t 执行,发现crontab下运行正常,问题得以解决。注意到ssh命令中的-t参数,是用来控制给ssh分配伪终端。注意到上述问题出错信息,结合ssh -t参数的含义,转载 2025-02-27 12:48:23 · 21 阅读 · 0 评论 -
SSH The authenticity of host can‘t be established
需要在git仓库SSH key。转载 2025-02-27 12:47:28 · 248 阅读 · 0 评论 -
【cmake教程】find_path、find_library、find_program
查找成功时,会向变量<LIBRARY_NAME>中添加成功找到头文件的库文件(包含完整路径),如果在某个路径下查找多个头文件,只要查找到多个头文件中的某一个,也算执行成功。find_path 一般用于在某个目录下查找一个或者多个头文件,命令的执行结果会保存到 <VAR> 中。查找成功时,会向变量<VAR>中添加成功找到头文件的目录,如果在某个路径下查找多个头文件,只要查找到多个头文件中的某一个,也算执行成功。和 find_path 一样,命令的执行结果会默认缓存到 CMakeCache.txt 中。转载 2025-01-23 21:55:30 · 73 阅读 · 0 评论 -
Linux命令`install`详解:不仅仅是安装工具
install在Linux的世界中,install命令是一个经常被提及但可能并不被广泛理解的实用工具。尽管它的名字让人误以为它只与安装软件包有关,但实际上,install命令在数据处理和分析中同样扮演着重要的角色。本文将带您深入了解install命令的用途、工作原理、主要特点、实际应用示例以及一些最佳实践。转载 2025-01-23 09:42:27 · 95 阅读 · 0 评论 -
Linux 命令详解:install 命令 - 复制并安装文件
install命令用于安装、升级软件,或者备份数据。install 的功能和cp命令类似,都可以将文件/目录拷贝到指定的位置。不同的是,install 允许你控制目标文件的属性,通常用于程序的 Makefile 文件(执行),使用它来将程序拷贝到目标(安装)目录。语法选项:为每个已存在的目的地文件进行备份。-b:类似--backup,但不接受任何参数。-C--compare:比较每对源文件和目标文件,在某些情况下,根本不修改目标-d:所有参数都作为目录处理,而且会创建指定目录的所有主目录。-D。转载 2025-01-23 09:41:26 · 406 阅读 · 0 评论 -
linux进程---exec族函数(execl, execlp, execle, execv, execvp, execvpe)
linux函数查询在调用进程内部执行一个可执行文件。可执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件。exec函数族分别是:execl, execlp, execle, execv, execvp, execvpeexec函数族的函数执行成功后不会返回,调用失败时,会设置errno并返回-1,然后从原程序的调用点接着往下执行。path:可执行文件的路径名字。转载 2025-01-16 23:15:45 · 37 阅读 · 0 评论 -
让事件飞 ——Linux eventfd 原理与实践
目前越来越多的应用程序采用。转载 2025-01-05 20:55:08 · 103 阅读 · 0 评论 -
Linux定时函数timerfd的使用问题以及解决办法
本文讲述使用epoll+timerfd+eventfd的组合来解决一个程序退出问题,如果有不对的地方,欢迎指正!Linux定时函数timerfd的使用问题以及解决办法-优快云博客。转载 2025-01-05 20:29:09 · 82 阅读 · 0 评论 -
timerfd简介
timerfd的由来比较简单,我们以往在使用定时器时,需要设定超时时间和超时后的回调函数,在定时器时间到来时,我们所注册的回调函数将会被执行。但是这种定时器很难被epoll等 I/O 多路复用机制接管。于是 Linux 下的timefd应运而生,使用timerfd创建出的定时器是基于文件描述符进行管理的,在达到超时时间时,描述符将置为可读,并可以从中读取到超时次数(启动定时器后或上次read之后的超时次数)。Linux 提供如下三个系统调用去使用timerfd。转载 2025-01-05 19:32:14 · 57 阅读 · 0 评论 -
__thread详解(gcc关键字)
只能修饰POD类型(类似整型指针的标量,不带自定义的构造、拷贝、赋值、析构的类型,二进制内容可以任意复制memset,memcpy,且内容可以复原)。可用于修饰全局变量,函数内的静态变量,不能修饰函数的局部变量或class的普通成员变量。__thread可用于全局的静态文件作用域,静态函数作用域或一个类中的静态数据成员。线程局部存储(tls)是一种机制,通过这一机制分配的变量,每个当前线程有一个该变量的实例.__thread变量在每一个线程中都有一份独立实例,各线程值是互不干扰的。转载 2024-12-27 16:33:21 · 164 阅读 · 0 评论 -
GCC、CMake、CMakelist、Make、Makefile、Ninja啥关系?一图讲透!
makefile就是一个脚本文件,简单的说就像一首歌的乐谱,make工具就像指挥家,指挥家根据乐谱指挥整个乐团怎么样演奏,make工具就根据makefile中的命令进行编译和链接的。的写法,所以cmake只需要用户通过对源码文件的简单描述(就是CMakeLists.txt文件),就能自动生成一个project的makefile文件或者ninja文件,然后就可以通过ninja或者make进行启动编译了。、QT 的 qmake,微软的 MSnmake,BSD Make(pmake),Makepp等等。转载 2024-12-15 22:32:08 · 117 阅读 · 0 评论 -
Ubuntu 14.04 更换源(官方源——>阿里源)
Ubuntu系统自带的源都是来自于国外,国内用户在使用时下载慢而且会出现安装的与源不匹配而出错的现象。转载 2024-12-15 22:07:10 · 1071 阅读 · 0 评论 -
ubuntu14.04下安装visual studio code
彻底清除,包括配置。# 只是卸载,保留配置。# 彻底清除,包括配置。# 只是卸载,保留配置。# 只是卸载,保留配置。# 彻底清除,包括配置。原创 2024-12-15 22:04:42 · 571 阅读 · 0 评论 -
唤醒机制——管道fd、eventfd、socketpair
如果有其他任务要处理,那么这些工作线程要能立刻处理这些任务,而不是在。如果将超时时间设置为0,在没有任何网络IO事件和其他任务需要处理的情况下,这些工作线程实际上会空转,白白浪费了CPU。,相当于服务器和客户端的两个端点,每一端都可以读写数据,向其中一端写入数据后,就可以从另一端读取数据了。,如果将超时时间设置为大于0,则在没有网络IO事件但是主线程中有其他任务需要处理时,处理这些事件,在做完这些事件后,可能还需要处理其他任务,这时调用。上,需要唤醒时,向管道的另一端写入1字节,工作线程就立即被唤醒;转载 2024-12-07 15:56:35 · 89 阅读 · 0 评论 -
Linux进程间通信(四):命名管道 mkfifo()、open()、read()、close()
命名管道也被称为FIFO文件,它是一种特殊类型的文件,它在文件系统中以文件名的形式存在,但是它的行为却和之前所讲的没有名字的管道(匿名管道)类似。由于Linux中所有的事物都可被视为文件,所以对命名管道的使用也就变得与文件操作非常的统一,也使它的使用非常方便,同时我们也可以像平常的文件名一样在命令中使用。转载 2024-11-21 14:08:19 · 67 阅读 · 0 评论 -
高级I/O函数二
fd:为即将映射到进程空间的文件描述字,一般由open()返回,同时,fd可以指定为-1,此时须指定flags参数中的MAP_ANON,表明进行的是匿名映射(不涉及具体的文件名,避免了文件的创建及打开,很显然只能用于具有亲缘关系的进程间进行通信)。l_whence确定文件内部的位置指针从哪开始,l_star确定从l_whence开始的位置的偏移量,两个变量一起确定了文件内的位置指针先所指的位置,即开始上锁的位置,然后l_len的字节数就确定了上锁的区域。如果遇到文件结尾,已无数据可读,则返回0。转载 2024-11-16 21:10:25 · 44 阅读 · 0 评论 -
【linux】图文并茂|彻底搞懂零拷贝(Zero-Copy)技术
Linux系统中一切皆文件,仔细想一下Linux系统的很多活动无外乎读操作和写操作,零拷贝就是为了提高读写性能而出现的。2. 数据拷贝基础过程在Linux系统内部缓存和内存容量都是有限的,更多的数据都是存储在磁盘中。对于Web服务器来说,经常需要从磁盘中读取数据到内存,然后再通过网卡传输给用户:上述数据流转只是大框,接下来看看几种模式。2.1 仅CPU方式当应用程序需要读取磁盘数据时,调用read()从用户态陷入内核态,read()这个系统调用最终由CPU来完成;转载 2024-11-16 21:08:04 · 255 阅读 · 0 评论 -
看一遍就理解:零拷贝原理详解
mmap就是用了虚拟内存这个特点,它将内核中的读缓冲区与用户空间的缓冲区进行映射,所有的IO都在内核中完成。是将读缓冲区的地址和用户缓冲区的地址进行映射,内核缓冲区和应用缓冲区共享,所以节省了一次CPU拷贝‘’并且用户进程内存是。,可以把内核空间和用户空间的虚拟地址映射到同一个物理地址,这样的话,就可以减少IO的数据拷贝次数啦,示意图如下。从流程图可以看出,传统IO的读写流程,包括了4次上下文切换(4次用户态和内核态的切换),4次数据拷贝(次用户空间与内核空间的上下文切换,以及3次数据拷贝。转载 2024-11-16 21:06:43 · 55 阅读 · 0 评论 -
Linux网络编程 | 零拷贝 :sendfile、mmap、splice、tee
主要就是利用各种技术,避免让CPU做大量的数据拷贝任务,以此减少不必要的拷贝。或者借助其他的一些组件来完成简单的数据传输任务,让CPU解脱出来专注别的任务,使得系统资源的利用更加有效Linux中实现零拷贝的方法主要有以下几种,下面一一对其进行介绍。转载 2024-11-16 21:05:24 · 75 阅读 · 0 评论 -
还在为慢速数据传输苦恼?Linux 零拷贝技术来帮你!
程序员的终极追求是什么?当系统流量大增,用户体验却丝滑依旧?没错!然而,在大量文件传输、数据传递的场景中,传统的“数据搬运”却拖慢了性能。为了解决这一痛点,Linux 推出了零拷贝技术,让数据高效传输几乎无需 CPU 操心。今天,我就用最通俗的语言讲解零拷贝的工作原理、常见实现方式和实际应用,彻底帮你搞懂这项技术!总结来说,DMA 确实减轻了 CPU 在数据传输中的负担,让数据从硬盘传输到内核缓冲区和内核缓冲区到网卡时几乎无需 CPU 的参与。然而,DMA 无法彻底解决数据在内核和用户空间之间的拷贝问题。转载 2024-11-16 21:03:42 · 61 阅读 · 0 评论 -
零拷贝中的DMA/MMAP/sendfile/splice
该技术是指计算机执行操作时,CPU不需要先将数据从某处内存复制到另一个特定区域这种技术通常用于通过网络传输文件时节省CPU周期和内存带宽1.零拷贝技术可以减少数据拷贝和共享总线操作的次数,消除传输数据在存储器之前不必要的中间拷贝次数,从而有效地提高数据传输效率2.零拷贝技术减少了用户进程地址空间和内核地址空间之间因为上下文切换而带来的开销可以看出没有说不需要拷贝,指示说减少冗余[不必要]的拷贝Kafka、Netty、RocketMQ、Nginx均使用了零拷贝技术。转载 2024-11-16 21:02:04 · 41 阅读 · 0 评论 -
GCC的符号可见性: 解决Linux多个库同名符号冲突问题以及引用不同版本库的问题
某项目中因为使用到了不同版本库的问题,因此整理下的符号可见性问题,方便自己以后再次使用。转载 2024-11-13 19:32:24 · 146 阅读 · 0 评论 -
C语言中的多线程编程:POSIX线程库(Pthreads)入门与实战(四)
Pthreads(POSIX线程)在现代C语言多线程编程中扮演着至关重要的角色,它作为业界广泛接受的标准库,为开发人员提供了在Unix-like系统(如Linux、macOS等)上实现并行和并发任务的强大工具。:Pthreads库涵盖了多线程编程所需的各种基本功能,包括线程创建与销毁、线程同步(如互斥锁、条件变量、信号量等)、线程间通信(如屏障、线程特定数据等)、线程优先级管理、线程取消与清理等。同时,良好的编程习惯、充分的测试和对并发理论的深入理解也是解决这些问题的关键。转载 2024-11-05 14:31:33 · 162 阅读 · 0 评论 -
当线程遇到超时:用 func_timeout 优雅地说再见
真正地终止超时的线程,而不是让它们在后台继续运行。更好地控制程序的执行时间,提高效率。优雅地处理超时情况,不让一个任务拖累整个程序。记住,在编程世界里,时间就是金钱,效率就是生命。善用 func_timeout,让你的程序不再"迷路",准时"回家"。下次当你的程序遇到那些顽固的、不愿意结束的线程时,别忘了召唤 func_timeout 这个法力无边的"线程终结者"。它会帮你把那些超时的线程送入温柔的离别之乡,让你的程序再次风驰电掣!记住,在编程的世界里,有时候说再见,是为了更好的相遇。转载 2024-10-31 19:12:20 · 115 阅读 · 0 评论 -
std::lock_guard引起的思考:何时加锁?何时解锁?
这个类是一个互斥量的包装类,用来提供自动为互斥量上锁和解锁的功能,简化了多线程编程,用法如下:// 构造时自动加锁// 离开局部作用域,析构函数自动完成解锁功能用法非常简单,只需在保证线程安全的函数开始处加上一行代码即可,其他的都在这个类的构造函数和析构函数中自动完成。如何自动完成?其实 Just so so ...如果你细心可以发现,不管是,还是,都使用了一个std::mutex作为构造函数的参数,这是因为我们的lock_guard只是一个包装类,而实际的加锁和解锁的操作都还是。转载 2024-10-31 19:04:17 · 191 阅读 · 0 评论 -
单核情况下会有线程安全问题吗?
多线程。转载 2024-10-31 17:42:07 · 111 阅读 · 0 评论 -
可重入、异步信号安全以及线程安全的概念
如果信号处理函数中的操作与打断的函数的操作相同,而且这个操作中有静态数据结构等,当信号处理函数返回的时候(当然这里讨论的是信号处理函数可以返回),恢复原先的执行序列,可能会导致信号处理函数中的操作覆盖了之前正常操作中的数据。由于前段时间,程序偶尔异常挂起不工作,检查后发现时死锁了,原因就是:在信号处理函数里面调用了fprintf. printf等io函数是需要对输出缓冲区加锁,这类函数对本身是线程安全的,但是对信号处理函数来说是不可重入的(在没有返回之前,不能再次调用),即不是异步信号安全的。转载 2024-10-30 19:56:04 · 81 阅读 · 0 评论 -
Linux-C编程 / 多线程 / 一个简洁可靠的线程池实现
有的人可以很轻易地让自己拼命工作,并且认为自己强大到可以通过减少睡眠来尽快实现自己的目标。只需要 thpool_resume() 中,将 threads_on_hold = 0,就可以让线程返回到原来被中止时的工作状态。正确的做法是:系统地、有意识地为睡眠留下一席之地,为每天的生活保留一部分精力和创造力、解决问题的能力,以应对一些意外情况。程序里是用队列来管理任务的,这里的 job 首先是一个队列节点,携带的数据是 function + arg。创建用户指定数目的线程,用一个二级指针来指向这一组线程;转载 2024-10-30 19:50:53 · 41 阅读 · 0 评论 -
信号处理对进程执行的影响
如果strtok函数当第一个参数为NULL时的执行被信号处理函数中止,而且信号处理函数中也使用了strtok函数,那么当进程返回到被中断前的strtok函数执行时,就会出现错误,因为依赖的全局变量被改变了。此时,除非系统调用结束,或者 调用了sleep原语进行睡眠(且非快速I/O的短暂睡眠)让出CPU时,信号处理函数才可执行,否则信号处理函数无法打断进程当时的执行。当第一个参数为NULL时,strtok函数将在上一次执行该函数结束的位置(第一个被分出的单词的尾部)继续寻找下一个单词。转载 2024-10-29 15:17:30 · 50 阅读 · 0 评论 -
【Linux】一篇文章彻底搞定信号!
SIGCHLD:17号信号,Child stopped or terminated(子进程发送给父进程的信号,但该信号为忽略处理的)SIGKILL:9号信号,Kill signal(杀死进程信号),action:term,该信号不能被阻塞、忽略、自定义处理。ctrl + c:SIGINT(2),发送给前台进程,& 进程放到后台运行,fg 把刚刚放到后台的进程,再放到前台来运行。,收到14号信号,告诉内核在seconds秒后给进程发送SIGALRM信号,该信号默认处理动作为终止当前进程。转载 2024-10-29 14:13:40 · 41 阅读 · 0 评论 -
函数可重入性(Reentrancy)概念详解
重入一般可以理解为一个函数在同时多次调用,例如操作系统在进程调度过程中,或者单片机、处理器等的中断的时候会发生重入的现象。可重入的函数必须满足以下三个条件:(1)可以在执行的过程中可以被打断;(2)被打断之后,在该函数一次调用执行完之前,可以再次被调用(或进入,reentered)。(3)再次调用执行完之后,被打断的上次调用可以继续恢复执行,并正确执行。可重入函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据。转载 2024-10-29 11:23:27 · 184 阅读 · 0 评论 -
IPC--消息队列,msgget,msgctl,msgsnd,msgrcv,msqid_ds结构体
消息队列(Message Queue)是一种用于进程间通信(IPC)的机制,它允许进程以消息的形式交换信息。消息队列是一种数据结构,存储由发送进程放入的消息,允许接收进程按顺序读取这些消息。消息队列可以在内核中持久存在,即使发送或接收进程退出,消息队列中的消息仍然可以保留,直到它们被处理。转载 2024-10-29 11:21:21 · 109 阅读 · 0 评论 -
LinuxThread vs NPTL
当一个线程的PID等于TGID时,这个线程就是线程组长,其PID也就是这个线程组的进程号。在实现LinuxThread之前,系统内核并没有提供任何对线程的支持,实现LinuxThread时也并没有针对其做任何的改动,所以LinuxThread只能使用现有的系统调用来创建一些用户接口来尽量模仿POSIX定义的API的语义,这也就是导致了pthread之外的系统调用接口表现出来的行为跟POSIX的线程标准不一致,如最简单的在同一个进程里的不同线程里调用getpid()的结果不一致,具体原因后面详细说明。转载 2024-10-29 11:18:13 · 38 阅读 · 0 评论 -
Linux高级编程——线程信号处理
Linux 线程编程中,需谨记两点:1) 信号处理由进程中所有线程共享;2) 一个信号只能被一个线程处理。不要在线程信号屏蔽字中阻塞、等待和捕获不可忽略的信号(不起作用),如 SIGKILL 和 SIGSTOP。不要在线程中阻塞或等待 SIGFPE/SIGILL/SIGSEGV/SIGBUS 等硬件致命错误,而应捕获它们。在创建线程前阻塞这些信号(新线程继承信号屏蔽字),然后仅在 sigwait() 中隐式地解除信号集的阻塞。转载 2024-10-29 10:26:27 · 223 阅读 · 0 评论 -
Linux内核源代码情景分析 阅读笔记 1 信号处理中的嵌套信号
该程序首先将子进程所在进程组设为前台进程组, 然后打开vim. 子进程退出后父进程将SIGTTOU信号的handleler设为sigttouhandler, 并调用tcsetpgrp导致父进程收到SIGTTOU信号, 这样父进程就进入sigttouhandler, sigttouhandler内部再调用tcsetpgrp, 运行结果就是父进程变成前台进程, 可以正常echo。信号嵌套: 执行A信号的处理程序时, 又收到了A信号。tcsetpgrp(): 设置终端前台进程组。转载 2024-10-29 10:12:59 · 54 阅读 · 0 评论 -
探索 Linux 下的内存映射(mmap):原理、应用与实践
mmap是一个系统调用,用于在内存中创建映射区域,将文件或者设备映射到进程的地址空间,从而允许对这些映射区域进行读写操作。通过mmap函数,程序可以直接将文件内容映射到内存中,从而避免了频繁的文件 I/O 操作,提高了访问文件数据的效率。此外,mmap还可以用于创建匿名内存映射,用于进程间通信或者共享内存。功能说明:shm_open 用于创建或者打开共享内存文件。转载 2024-10-28 15:29:22 · 96 阅读 · 0 评论 -
linux 内存文件共享,两种Linux共享内存的比较
sysv shm的实现可以参考glibc源码,shm_open(3) 打开一个名为abc的共享内存,等价于open("/dev/shm/abc", ..),其中 /dev/shm 是Linux下sysv共享内存的默认挂载点。因为接口易使用,且可以方便的persist到文件,避免主机shutdown丢失数据的情况,所以在现代操作系统上一般偏向于用mmap而不是传统的System V的共享内存机制。mmap映射的内存在不是持久化的,假如进程关闭,映射随即失效,除非事前已经映射到了一个文件上。转载 2024-10-28 15:26:00 · 70 阅读 · 0 评论 -
宋宝华:世上最好的共享内存(Linux共享内存最透彻的一篇)
不能这么简单地理解,fd本身是一个进程级别的概念,每个进程有自己的fd的列表,比如进程B收到进程A的fd的时候,进程B自身fd空间里面自己的前面200个fd都已经被占用了,那么进程B接受到的fd就可能是201。这说明你还是没搞明白fd是一个进程内部的东西,是不能跨进程的概念。坦白讲,mmap、munmap这样的API让我找到了回家的感觉,刚入行做Linux的时候,写好framebuffer驱动后,就是把/dev/fb0 mmap到用户空间来操作,所以mmap这样的 API,真的是特别亲切,像亲人一样。转载 2024-10-28 15:25:02 · 142 阅读 · 0 评论 -
虚拟内存与物理内存:计算机存储系统的核心要素
物理内存,也称为主存或实体内存,是计算机硬件系统中实际存在的存储设备,通常由半导体芯片组成。它用于存储正在运行的程序和数据,是计算机处理器能够直接访问的内存区域。物理内存的容量通常以字节(Byte)为单位,常见的物理内存容量有 4GB、8GB、16GB 等。虚拟内存是一种计算机系统中的内存管理技术,它通过将一部分硬盘空间模拟成内存来使用,从而扩展计算机系统的内存容量。虚拟内存的实现方式是将程序的代码和数据分成若干个页面,每个页面的大小通常为 4KB 或 8KB。转载 2024-10-28 12:37:37 · 553 阅读 · 0 评论 -
从内核世界透视 mmap 内存映射的本质(原理篇)
私有匿名映射,其主要用于进程申请虚拟内存,以及初始化进程虚拟内存空间中的 BSS 段,堆,栈这些虚拟内存区域。私有文件映射,其核心特点是背后映射的文件页在多进程之间是读共享的,多个进程对各自虚拟内存区的修改只能反应到各自对应的文件页上,而且各自的修改在进程之间是互不可见的,最重要的一点是这些修改均不会回写到磁盘文件中。我们可以利用这些特点来加载二进制可执行文件的 .text , .data section 到进程虚拟内存空间中的代码段和数据段中。转载 2024-10-28 11:16:48 · 263 阅读 · 0 评论