Linux
文章平均质量分 79
致守
这个作者很懒,什么都没留下…
展开
-
为什么Linux下多线程程序如此消耗虚拟内存
最近在进行服务器内存优化的时候,发现一个非常奇妙的问题,我们的认证服务器(AuthServer)负责跟第三方渠道SDK打交道,由于采用了curl阻塞的方式,所以这里开了128个线程,奇怪的是每次刚启动的时候占用的虚拟内存在2.3G,然后每次处理消息就增加64M,增加到4.4G就不再增加了,由于我们采用预分配的方式,在线程内部根本没有大块分内存,那么这些内存到底是从哪来的呢?让人百思不得其解。转载 2024-03-20 13:31:09 · 10 阅读 · 0 评论 -
netcat
说明:该指令将尝试连接traget的20-250,500-600,5990-7000端口;说明:当未指定参数运行netcat时,netcat打印Cmd line提示用户输入命令参数,随后从stdin读取一行内容,并将其分解为参数。1 当netcat接收到入站udp连接时,它会创建一个“连接的套接字”返回到连接的源(udp反向连接回去),然后使用write()发送数据。2 基于这个特性,当客户端中断udp连接后再次连接时源端口发生改变,此时服务端将不再接收连接,除非指定源端口为最初的端口。转载 2024-03-09 17:50:36 · 14 阅读 · 0 评论 -
【深度】韦东山:一文看懂linux对中断处理的前世今生(附免费视频)
本文,4200字,研究代码花了一天,写出来花了一天;录视频估计又得花半天;真怀念以前简单粗暴的生活啊:拿起话筒就录视频,先画好图?那是不需要的文档?那是不存在的真是洒脱.....现在,要写文档,又要画流程图,十几、二十分钟的视频,真是沤心沥血做出来的,各位,别浪费了,欢迎享受。转载 2024-03-04 17:05:38 · 46 阅读 · 0 评论 -
【操作系统】各平台定时器粒度
中,定时器的精度取决于系统时钟的精度。在 Linux 中,可以使用不同的定时器实现,如基于系统调用的定时器(如 setitimer)、基于 POSIX 标准的定时器(如 timer_create)、基于定时器文件描述符的定时器(如 timerfd_create)等。这些定时器实现的精度和使用方式可能有所不同,需要根据具体的应用场景进行选择和使用。需要注意的是,在使用定时器时,定时器的精度可能会受到其他系统资源的影响,如 CPU 占用率、I/O 操作等,因此在实际应用中需要进行充分的测试和优化。转载 2024-02-06 17:55:22 · 78 阅读 · 0 评论 -
Linux中fuser命令用法详解
n:space 指定一个不同的命名空间(space).这里支持不同的空间文件(文件名,此处默认)、tcp(本地tcp端口)、udp(本地udp端口)。fuser可以发送它已知的信号给访问的指定文件进程而代替-k参数默认发送的SIGKILL,例如:只是挂起进程,那么发送HUP信号就可以了。-4:使用IPV4套接字,不能和-6一起应用,只在-n的tcp和udp的命名存在时不被忽略。-6:使用IPV6套接字,不能和-4一起应用,只在-n的tcp和udp的命名存在时不被忽略。-k:杀掉访问文件的进程。转载 2024-01-10 14:34:06 · 302 阅读 · 1 评论 -
linux shell 下各种进制数据转换
printf 命令代码后来我看了,%c, 109, 后面的109是按字符串对待的,只会打印第一个字符'1',这是解释的问题了.作为一个c++程序员,最后我还是选择了与c类似的awk 中的printf 来进行数制转换。这两个就不举例了,其中awk 是基础工具,默认都有安装的, 是一个优秀的文本处理工具。赋值语句 let 或(()) 不能直接用=号,直接用等号是字符串照印。郑重推荐bc 计算器, 它支持交互模式, 可以使得转换根据简单,方便。16 进制输入时 a-f 必需用大写, 小写会被视为变量,会报错。转载 2023-08-25 10:53:52 · 431 阅读 · 0 评论 -
VSCode在win下远程调试linux(cmake)(c/c++)
C://Users/xxx/.ssh/id_rsa.pub拷贝到服务器的~/.ssh/authorized_keys,请不要采用复制粘贴文本的方式,我是用xftp将文件复制到服务 器,再执行如下命令。点击要下载的插件,进入主页点击右侧的 Download Extension 链接,得到下载下来的离线安装包,以 .vsix 为扩展名结尾。通过以下配置,只要源代码改动了,会自动触发cmake 和make ,无需手动编译。(2)配置launch.json 和tasks.json。tasks.json创建。转载 2023-08-08 18:05:51 · 200 阅读 · 0 评论 -
VS Code远程调试Linux C指南
VS Code是微软向开发者提供的一款真正意义上的跨平台编辑器,能运行在Windows、Mac OS、Linux系统上,支持多种开发语言,如C、C++、Python等,具有非常丰富的插件,界面简洁友好。在VS Code菜单栏的“调试(D)”选项选中启动调试,或按下快捷键F5,连接成功的界面如下,可单步运行、设置断点等,和IAR开发软件调试类似,使用起来非常方便。编译一个App的可执行文件,如名称app,编译时应带有“-O0 -g”选项参数,将可执行文件di拷贝到目标机下,如/project/app。转载 2023-08-08 18:01:55 · 315 阅读 · 0 评论 -
posix是什么都不知道,还好意思说你懂Linux?
POSIX 标准的制定最后投票敲定阶段大概是 1991~1993 年间,而此时正是Linux 刚刚起步的时候,这个 UNIX 标准为 Linux 提供了极为重要的信息,使得 Linux 能够在标准的指导下进行开发,并能够与绝大多数 UNIX 操作系统兼容。如今,语言的跨平台的程序都是以这样的方式实现的。但是在不同的平台下,仍需要重新编译。一般地,操作系统为了考虑实现的难度和管理的方便,它只提供一少部分的系统调用,这些系统调用一般都是由C和汇编混合编写实现的,其接口用C来定义,而具体的实现则是。转载 2023-07-29 09:25:27 · 78 阅读 · 0 评论 -
unrecognized relocation (0x2a) in section `.text`
网址为:http://ftp.gnu.org/gnu/binutils/更新之后,重新编译,即可消除此错误。出现这个问题最有可能的原因为。或者重启终端之后,待查看。的时候就会报错,升至。转载 2023-07-21 14:33:46 · 495 阅读 · 0 评论 -
float内存值定义域与浮点值对应表
【代码】float内存值定义域与浮点值对应表。转载 2023-05-24 15:03:38 · 397 阅读 · 0 评论 -
浮点数的表示和精度
double的尾数是52bit,高于32bit的int,所以用dobule表示int不会有精度损失。matlab内部采用double,1+1/2^53对double来说就是1,所以1+1/2^53不会大于1。从表中可以看到,double内部表示的设计是很有规律的,按照对应64位数的顺序依次为 +0、正非规范数、正规范数、正无穷大、符号位为正的NaN、-0、负非规范数、负规范数、负无穷大、符号位为负的NaN。都是 1.xxxxxx * 2^e 表示的,这个 xxxxx 就是底数,1 是省略不写的。转载 2023-05-24 15:03:54 · 2873 阅读 · 0 评论 -
Linux生成core文件相关配置,core文件调试示例
使用ulimit -c命令可以查看当前系统对于core文件的配置,0表示不生成core文件;不为0的数字a表示限制core文件大小不超过a,单位是k;unlimited则表示不限制core文件大小。(2)在/etc/sysctl.conf中添加kernel.core_pattern=core路径;然后执行sysctl -p加载。(1)执行 sysctl kernel.core_pattern=core路径 命令进行修改,重启后失效。转载 2023-04-26 09:03:50 · 2800 阅读 · 0 评论 -
当printf遇上多线程
在操作系统中,一个进程就是一个程序的实例。而线程是进程的最小分割,好比运行一个盖楼房的程序进程,需要各有分工,有的人打地基,有的人刷水泥,有的人搬材料一样。Printf是最基本的一个函数,如何去用,何时能用,大家都要心中有数,才不至于在小沟处翻大船。不过再仔细看看,大部分结果都是不正确的,有时候几个Hello之后才有一个World,有时Hello和World交叉在了一起,变成了HlWelloorHld。一个线程实际上就是一个函数的实例,该线程拷贝了线程函数的代码而执行,所以多个线程可以运行同一个线程函数。转载 2023-04-13 14:43:58 · 463 阅读 · 0 评论 -
muduo网络库:12---C++多线程编程精要之(C/C++系统库的线程安全性
本专题未完结,参阅下一篇文章(线程的创建与销毁的守则)muduo网络库:12---C++多线程编程精要之(C/C++系统库的线程安全性)_mb6128aabee41d4的技术博客_51CTO博客。转载 2023-04-13 14:39:36 · 382 阅读 · 0 评论 -
第十四章 Linux终端设备驱动
硬件缓冲区容量的原因,不是所有的写程序要求的字符都可以在调用写函数时被发送,因此写函数应当返回能够发送给硬件的字节数以便用户程序检查是否所有的数据被真正写入。驱动的这种层次非常类似于面向对象编程中基类、派生类的关系,派生类针对特定的事物会更加具体,而基类则站在更高的抽象层次上。进行的设置,它取决于具体的设备驱动。参数中,若新旧参数相同,则什么都不需要做,对于被改变的设置,需完成硬件上的设置,代码清单。驱动的列表,包括驱动名、缺省的节点名、驱动的主编号、这个驱动使用的次编号范围,以及。转载 2023-04-05 23:59:03 · 308 阅读 · 0 评论 -
Linux 条件变量使用细节(为何调用 pthread_cond_wait 前加锁,函数内部解锁,返回时又加锁)
对于 2,只要在 pthread_cond_signal 之后与解锁 mutex 之间有其他语句需要执行,那么由于 mutex 在这时已经被这个线程锁,还没有解锁,所以调用 pthread_cond_wait 的那个线程在pthread_cond_wait 返回前的锁 mutex 的行为就会阻塞,直到 pthread_cond_signal 后的语句执行完解锁,pthread_cond_wait 才会返回。pthread_cond_signal 唤醒的是阻塞在 pthread_cond_wait 的进程。转载 2023-03-20 12:59:56 · 849 阅读 · 0 评论 -
左值和右值
在探讨c++11中的Move函数前,先介绍两个概念(左值和右值)转载 2023-03-15 20:26:50 · 88 阅读 · 0 评论 -
C++ 之 std::move
当然并不是,我自己总结了一下,如果你的类或者结构体中所有的成员都已经实现了std::move 语义,并且没有自定义析构函数(还没有搞清楚为什么有自定义的析构就不行), 那可以不用显式提供,编译器会自动有一个。标准模板库的 std::string, std::vector,std::map ,std::shared_ptr等等都自己实现了move 语义。上面的函数参数是值传递,一般对于标准数据类型,会采用值传递,对于复杂类型,结构体,类对象等并不会用值传递,因为会多一份对象的拷贝。这句代码是调用了转移构造。转载 2023-03-15 20:20:50 · 547 阅读 · 0 评论 -
基于C++11的线程池(threadpool),简洁且可以带任意多的参数
原文地址 :咳咳。C++11 加入了线程库,从此告别了标准库不支持并发的历史。然而 c++ 对于多线程的支持还是比较低级,稍微高级一点的用法都需要自己去实现,譬如线程池、信号量等。线程池(thread pool)这个东西,在面试上多次被问到,一般的回答都是:“管理一个任务队列,一个线程队列,然后每次取一个任务分配给一个线程去做,循环往复。” 貌似没有问题吧。但是写起程序来的时候就出问题了。废话不多说,先上实现,然后再啰嗦。转载 2023-03-15 20:21:03 · 1316 阅读 · 0 评论 -
基于C++ std::thread 的线程池
第二,task不接受参数,挂callback 函数是以 void* 方式传入。这个地方的释放,是需要小心的。可以继承 Task 接口,实现 Run() 函数,然后new,push。注意,task必须是new出来的才可以,因为框架会 delete,必须这么干。否则出问题后果自负。总之,最核心的一句话,就是 delete void*型的指针,出现的问题就是不会调用析构函数,就可能会造成内存泄露。其实还可以另外的方式,就是每个线程一个que,生产者线程去实现分发。第三,这个task在一个que里面,线程去抢占。转载 2023-03-15 20:18:56 · 368 阅读 · 0 评论 -
关于inet_ntoa函数的思考
通过分析,inet_ntoa函数的输入参数是unsigned int类型的ip地址,返回的却是指向ip字符串的指针,很明显,ip字符串所占的内存是在函数内部分配的,而我们并不需要释放该内存,(通过malloc等函数),我们设想如果inet_ntoa函数如果采用这种方式,那我们岂不没调用一次,还要释放一下内存?可见,并不是我们预想的结果。缺点是函数外的代码也可以修改,显然我们从inet_ntoa函数的输入输出看,也不会是这种方法;,也就是说下一次调用该函数时会覆盖这个数组的内容,所以就会出现上述的结果。转载 2023-03-13 19:04:53 · 262 阅读 · 0 评论 -
ubuntu 永久打开USB串口权限、232串口权限
终端效果:该方法只能临时添加访问权限,一次性的,下次拔插串口线或者开关机还需要再次赋予串口权限。首先查看用户组终端输出:可以看到用户 root ,所属用户组为 dialout, 因此一种方法是把我们的当前用户名 加入到这个用户组。最后,logout 再登入系统,登陆名wang就可以使用该串口了 。终端效果:该方法只能临时添加访问权限,一次性的,下次拔插串口线或者开关机还需要再次赋予串口权限。首先查看用户组终端输出:转载 2023-03-13 17:32:51 · 2375 阅读 · 0 评论 -
Linux Kernel in a Nutshell - 7
Customizing a Kernel 原文链接 我的博客 以问题做关键字搜索,还有问题 构建你自己的 Linux 内核版本最困难的部分,应该就是确定哪一个驱动以及配置选项是你的设备需要的。本章将会手把手带你查找选择合适的驱动。Using a Distribution Kernel 一个最简单确定需要模块的…转载 2023-03-13 17:26:52 · 161 阅读 · 0 评论 -
在 Linux 中永久修改 USB 设备权限
上面lsusb的输出中,找出你的 USB 设备,并找出"idVendor"和"idProduct"字段。作为一个永久的方式,你可以创建一个基于 udev 的 USB 权限规则,它可以根据你的选择分配任何权限模式。用你自己的"idVendor"和"idProduct"来替换默认值。MODE="0666"表示USB设备的权限。当你在运行一个会读取或者写入USB设备的进程时,进程的用户/组必须有权限这么做才行。改变 USB 设备的权限,但是手动的权限改变只是暂时的。USB 设备会在下次重启时恢复它的默认权限。转载 2023-03-13 17:24:51 · 756 阅读 · 0 评论 -
Linux下使用C/C++获取可用串口
最近在Nano上发现个问题,插多个USB-TTL后,串口号会发生变化。看来笔者之前的同学应该都知道,笔者在代码中是将端口号写死了的。面对多变的串口,我们应该怎么办呢?本篇笔者就分享一下,使用C/C++获取可用串口的方法。之前也说过,下万物皆文件,每个串口的注册实际上就会生成一个文件,我们要获取可用串口,也就是要查找当前的文件名。废话不多说,还是先献上代码:笔者将代码文件命名为find.cpp,因此用命令行编译为。转载 2023-03-13 14:26:37 · 761 阅读 · 0 评论 -
getifaddrs
ifu_dstaddr 如果(ifa_flags&IFF_POINTOPOINT)有效,ifu_dstaddr指向一个包含p2p目的地址的结构。ifu_broadaddr 如果(ifa_flags&IFF_BROADCAST)有效,ifu_broadaddr指向一个包含广播地址的结构。ifa_addr 指向一个缓冲区,其中包含地址族私有数据。ifa_addr 指向一个包含网络地址的sockaddr结构。ifa_netmask 指向一个包含网络掩码的结构。ifa_name 网络接口名。转载 2023-03-09 19:14:32 · 381 阅读 · 0 评论 -
6种查看Linux进程占用端口号的方法
大部分涉及到网络的服务都必须打开一个套接字来监听传入的网络请求,而每个服务都使用一个独立的套接字。nmap 使用原始 IP 数据包来确定网络上可用的主机,这些主机的服务(包括应用程序名称和版本)、主机运行的操作系统(包括操作系统版本等信息)、正在使用的数据包过滤器或防火墙的类型,以及很多其它信息。nmap 使用原始 IP 数据包来确定网络上可用的主机,这些主机的服务(包括应用程序名称和版本)、主机运行的操作系统(包括操作系统版本等信息)、正在使用的数据包过滤器或防火墙的类型,以及很多其它信息。转载 2023-03-07 19:56:35 · 15115 阅读 · 0 评论 -
【makefile笔记】patsubst和wildcard函数使用小结
文章中的文字可能存在语法错误以及标点错误,请谅解;转载 2023-03-04 16:01:37 · 235 阅读 · 0 评论 -
ubuntu固定ttyUSB* 多个相同设备端口(ch340为例)
注:本人使用ch340g,ubuntu16.04,内核版本:4.15.0-55-generic。重启后,可以用pyserial使用串口:/dev/falling_prevention。删除配置信息后在/dev下找不到ttyUSB*(但是我要使用两个以上的ch340,只能另想办法。,发现还有一条有用信息:devpath!编译过程中遇到的问题再搜索解决。(待验证,后面试试)转载 2023-02-28 10:01:19 · 922 阅读 · 0 评论 -
Ros 与 STM32 之Ros串口同设备USB固定
是关于1-1.2的描述,记下其中的ATTRS{idVendor}、ATTRS{idProduct} 和 ATTRS{serial} 的值。只有在当不同的usb设备的idVendor和idProduct都相同的情况下才需要增加这个参数加以区分。linux系统插入多个USB串口设备时,串口的编号不是固定的,与串口上电的顺序有关。其中SUBSYSTEM的内容保持一致,之后的填入之前获取的信息,最后的SYMLINK的值可以自由发挥,取个自己想要的名字即可。细心的小伙伴可能已经发现了在第三步编写命名规则的文件中,转载 2023-02-28 10:01:54 · 538 阅读 · 0 评论 -
Linux环境下使用 USB转串口驱动(二)
然 后对波特率,数据位和停止位进行配置,键入"E",波特率选为115200 8N1(数据位8,奇偶校验无,停止位1),硬/软件流控制分别键入"F"和"G",并且都选No。也就是说,要在window获得焦点的时候加入usb转串口,然后再到虚拟机下将 这个设备添加进去,这时就可以在ubuntu下查看添加的这个设备的设备文件,一般是/dev/tty0或者 /dev/ttyS0。这种方法其实是将window的usb转串口作为虚拟机的串口,所以就是tty0或者ttyS0了,而不是真正在ubuntu下加载的。转载 2023-02-22 18:16:45 · 2302 阅读 · 0 评论 -
Ubuntu下找不到动态库.so问题解决方法
时,在进行环境配置等情况下,经常遇到找不到动态库.so的问题,下面提供几种解决方法。1.前提条件是当前系统下存在所需要的.so动态库。libxxxxx.so为动态库文件的名称。3.找到对应.so库的 find 命令。2.期间可能会用到定位软件依赖库的。转载 2023-02-17 10:17:01 · 2405 阅读 · 0 评论 -
linux怎样关闭网卡
你可能会根据你的需要执行以下命令。我会在这里列举一些你会用到这些命令的例子。当你添加一个网卡或者从一个物理网卡创建出一个虚拟网卡的时候,你可能需要使用这些命令将新网卡启用起来。另外,如果你对网卡做了某些修改或者网卡本身没有启用,那么你也需要使用以下的某个命令将网卡启用起来。启用、禁用网卡有很多种方法。在这篇文章里,我们会介绍我们使用过的最好的 5 种方法。启用禁用网卡可以使用以下 5 个方法来完成:ifconfig 命令:用于配置网卡。它可以提供网卡的很多信息。ifdown/up 命令:ifdown 命令用转载 2022-12-06 19:32:58 · 2469 阅读 · 0 评论 -
linux系统怎么重启网卡?linux重启网卡的三种教程
在实际工作中,经常会遇到Linux系统进行重启网卡的操作。在这里整理一下,进行多种方法的网卡重启。一、service network restart1、首先用CRT工具连接到Linux命令行界面。 或者进入操作系统界面,选择终端输入。2、如果我们对所有的网卡进行重启操作。 可以尝试输入:service network restart 命令进行操作。3、样就完成了用service network restart命令重启网卡的操作。二、ifconfig eth0 down / ifconfig eth0 up1转载 2022-12-06 19:31:42 · 9065 阅读 · 0 评论 -
Linux系统程序运行时加载动态库路径顺序
程序运行时加载动态库路径顺序(Linux)在linux系统中,如果程序需要加载动态库,它会按照一定的顺序(优先级)去查找:链接时路径(Link-time path)和运行时路径(Run-time path)不是一回事,当然,当你知道这个概念的时候,你当然明白。那么自制的库在没有指定运行时库的路径时,一般是不会找到你特定目录的,先来说说链接库的搜寻顺寻:在命令前加环境变量设置,该环境变量只对该命令有效,当该命令执行完成后,该环境变量就无效了。如下述命令:# 下面对编译时库的查找与运行时库的查找做一转载 2022-12-03 09:59:15 · 2619 阅读 · 0 评论 -
关于c ++:std :: atomic和non-atomic变量的性能如何?
我经常看到有关原子与互斥的性能的主题,但是我发现很难找到有关原子与非原子的信息。(编辑:在原始问题的这一点上,我给出了一个示例(请参见下文),该示例应被用来说明实现的更改,而不是询问有关该代码的特定问题。如果另一个线程正在写/读我的原子,这是否会减慢其他对同一变量的读/写速度?我尝试了此操作,但是读取的是值而不是写入的值,结果发现正常的float和std::atomic花费的时间相同。我不是想以此作为选择使我的代码具有线程安全性或非线程安全性的方法,只是想了解所涉及的开销。假设两者都是无锁的,可能不是。转载 2022-11-28 13:08:52 · 603 阅读 · 0 评论 -
一步一图带你深入理解 Linux 物理内存管理
在我们理解了物理内存的 NUMA 架构,以及在 NUMA 架构下的内存分配策略之后,本小节笔者来为大家介绍下如何正确的利用 NUMA 提升我们应用程序的性能。前边我们介绍了这么多的理论知识,但是理论的东西总是很虚,正所谓眼见为实,大家一定想亲眼看一下 NUMA 架构在计算机中的具体表现形式,比如:在支持 NUMA 架构的机器上到底有多少个 NUMA 节点?每个 NUMA 节点包含哪些 CPU 核,具体是怎样的一个分布情况?前面也提到 CPU 在访问本地 NUMA 节点中的内存时,速度是最快的。转载 2022-11-26 16:36:23 · 894 阅读 · 0 评论 -
互斥锁Mutex解锁两次
1.如果是Linux系统:互斥锁是由信号量实现的,连续两次解锁,当然不会卡住;但是如果此时有另外一个线程也在等待互斥锁,那当你第二次解锁的时候,另外一个线程也将进入代码段,这是不被允许的;包含的代码段,同一时间只能被一个线程调用,如果一个线程已经获取到互斥锁,还在代码段中(还未解锁),此时另一个线程执行此段代码时,是获取不到互斥锁的。2.如果是小系统:互斥锁可能是由某个全局变量实现,加锁解锁其实就是对变量的+1或-1,同样也会有Linux那样的问题;那么已经解锁的互斥锁,还能再次被解锁吗?转载 2022-11-10 14:46:17 · 1159 阅读 · 0 评论 -
pthread_mutex_unlock
1.如果是Linux系统:互斥锁是由信号量实现的,连续两次解锁,当然不会卡住;但是如果此时有另外一个线程也在等待互斥锁,那当你第二次解锁的时候,另外一个线程也将进入代码段,这是不被允许的;包含的代码段,同一时间只能被一个线程调用,如果一个线程已经获取到互斥锁,还在代码段中(还未解锁),此时另一个线程执行此段代码时,是获取不到互斥锁的。2.如果是小系统:互斥锁可能是由某个全局变量实现,加锁解锁其实就是对变量的+1或-1,同样也会有Linux那样的问题;那么已经解锁的互斥锁,还能再次被解锁吗?转载 2022-11-10 14:44:53 · 873 阅读 · 0 评论