自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(32)
  • 问答 (2)
  • 收藏
  • 关注

原创 Linux磁盘操作三部曲

磁盘操作,write,fflush,fsync,sync

2022-08-05 16:12:50 307 1

原创 popen/pclose导致脚本异常终结

pclose导致脚本异常终结

2022-07-07 11:49:09 802

原创 如何降低程序/动态库的大小

一、自己通过源码编译如果是我们自己的程序,那我们可以通过编译debug或release版本来控制生成文件的大小。一般来说我们在开发阶段编译debug版本,这样出现问题我们可以通过gdb等工具进行调试;而在发布阶段编译release版本,这样可以大幅减小目标文件的大小。如果我们使用gcc/g++编译器的话,-g和-ggdb参数会生成debug版本。二、只有程序或动态库如果别人给了我们一个debug版本的动态库,这个时候我们不想麻烦别人重新编译,那么有没有什么好办法呢?这个时候我们就要使用一个工

2022-01-14 11:37:27 1034 2

原创 开发常见问题小策略

在日常开发过程中,经常会碰到一些小问题,每次解决了之后等到下次再遇见,基本上又忘了,所以此处对一些常见问题及处理进行记录,后面会持续更新。1、问题:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!原因:主机秘钥发生变更解决方案:使用ssh-keygen -R [your server's IP] 这条指令...

2021-11-05 10:39:45 135

原创 怎么知道局域网内其他设备的IP

很多时候我们需要和局域网内的另外一台设备通信,那么我们必须知道该设备的IP。但是很多时候对于一个纯后台的设备,我们接了网线或者连了某个wifi之后,我们可能需要接显示屏然后敲ifconfig命令才能知道它的IP,这样就很不方便。下面提供两个方法。PING我们将自己的电脑也接入该局域网,查看自己电脑的IP地址,然后依次ping其可能的IP。命令:for/l %i in (1,1,255) do ping 192.168.1.%i -w 1 -n 1| find "回复"ARP直接使用...

2021-10-25 13:56:51 7351

原创 FTP出现500 Illegal PORT command

最近公司扩展海外业务,所以购买了一台亚马逊的服务器,在上面部署了FTP服务器(vsftpd)。后面我就通过命令行来测试这个FTP服务。登录服务器没有问题,但是每当我使用诸如ls、put这样的命令就会收到服务器返回500 Illegal PORT command,如下图所示:两条通道FTP客户端会与FTP服务器建立两条连接通道,一条为命令通道,一条为数据通道。命令通道为客户端主动发起,连接服务器的21端口(如果没有修改默认端口的话)。既然能够登陆成功说明这条通道是没有问题,ls这类的命令出现问题是

2021-08-19 14:13:37 9769

原创 Linux进程调度(1)-进程状态

Linux进程调度算是非常重要的知识点了,现在多进程、多线程开发如此普遍,多少还是要对Linux的进程调度系统有些熟悉的。在开始讲解真正的进程调度知识之前,有必要先说一下进程状态这个小知识。分类Linux进程状态主要分为:1、R (TASK_RUNNING),可执行状态2、S (TASK_INTERRUPTIBLE),可中断的睡眠状态3、D (TASK_UNINTERRUPTIBLE),不可中断的睡眠状态4、T/t (TASK_STOPPED or TASK_TRACED),暂停状态

2021-08-12 17:39:19 246

原创 多线程下的GDB调试方法

在Linux系统下做程序开发,GDB基本上是绕不过去的一门技术。很多初学者觉得GDB调试比较难,会本能的排斥,转而使用逐级增加日志打印的方式来调试。这种方式比较容易,但是相对来说比较麻烦,需要修改本地代码、编译、部署,花费的时间比较长。如果打印的部分没有达到预期目标,还需要反复修改代码、编译、部署。所以学会GDB调试程序是你进阶的一大步。启动GDB调试启动GDB分为两种,一种是直接使用GDB启动调试程序,另外一种是程序已经启动了,现在我们需要使用GDB来调试它。第一种,假定程序名为test,直接gd

2021-07-27 14:47:47 815

原创 如何提高C++代码质量

一般来说,人员的技术水平和代码质量的高低息息相关,但是人员技术水平的提高不是一朝一夕能够完成的。那么除此之外,我们有什么方法能够短时间提高团队的代码质量呢。从我过往的经验来说,有两个东西时间投入成本不大,但是对代码质量提高非常有作用,他们就是严格的编译条件以及第三方的检测工具。严格的编译条件目前编译器非常智能,很多危险或者异常的语法都能够被编译器捕获到,所以我们一定要善用编译器的分析功能,让编译器对我们的代码进下严格的检查。由于我一般使用Linux系统,编译器就选择了GCC,编译工具使用CMake,

2021-07-22 11:45:24 362

原创 FTP登录提示421 Service not available

最近一段时间有台设备登录FTP服务器一直失败,如果直接命令行用FTP命令,输入完用户名之后立马就回复421 Service not available,结果如下图所示:421是谁回复的421是FTP的标准命令。一般我们很容易认为这个结果是FTP服务器回复的,但是实际上服务器的421一般对应的描述是timeout,和我们的描述还是有点区别。这个问题通过抓包很容易解决,我们抓个包看下。我们很容易看到在客户端发了用户名之后,并没有收到服务器发的421命令,反而是收到了服务器发来的RST命令。.

2021-07-14 11:08:29 15772

原创 将ubuntu(linux)的网络通过网线分享给其他设备

简述一般情况下,我们都是通过路由器来共享网络,各个设备都连接同一个wifi就可以了。但是有的场景下,可能我们的工控机会直接通过4G模块插入4g卡来获得网络访问,其他设备如果通过有线连接我们的工控机,是否也可以获得网络访问呢?答案是可以。方法首先点击界面的网络图标选择Edit Connections,在弹出的页面中点击Add,然后点击Create,如下图所示:切换到Ethernet页面,选择需要分享的网卡(即其他设备有线连接的网卡),然后再切换到IPv4 Settings页面,将Met

2021-07-07 14:54:35 7403 1

原创 ubuntu给用户增加sudo权限并设置sudo免密

网上关于如何给普通用户增加sudo权限的方法很多,但是很多时候你按照网上的方法设置了以后,你在命令行下执行sudo命令居然还是需要输入密码。为什么别人都行但是就你不行呢?一般的方法假如你的用户名为test,那么基本上就是按照下图的方式编辑/etc/sudoers文件增加一行话就可以了。为什么别人可行经过我反复研究,如果你的用户是装系统的时候建立的,那么你按照这个方法设置以后,终端执行sudo仍然需要输入密码;但是如果你的用户是后期通过adduser命令后期创建的,那么你通过上图的配置是完

2021-07-02 13:12:05 824

原创 C++11好用的特性

一、简介C++11基本上可以说是现在做C++开发的必备技能,但是C++11那么多新的特性很多时候我们并不了解,实际开发中也没有使用。本文旨在整理C++11中那些常用并且好用的新特性以供大家在日常开发中使用,至于这些新特性的具体用法一般不做过多陈述。二、新特性2.1容器常用的容器包括vector、map、list、set等,这个不多介绍了,如果这些你都没用使用,那C++11跟你基本也没什么关系了。2.2线程std::thread以及常用的互斥锁、条件变量等,例如std::mutex

2021-05-13 14:57:12 224

原创 父进程被kill后,子进程的归属

一般来说如果我们启动了一个A进程,然后通过A进程再启动B进程,那么A进程就是B进程的父进程,或者说B进程是A进程的子进程。那么如果这个时候我们强杀了A进程之后,B进程会处于什么状态呢?是继续运行还是也退出了?实际情况是这两种情况都有可能发生,取决A进程的状态。如果A进程是会话首进程,那么A退出后,B进程也会退出;反之如果A进程不是会话首进程,那么A退出后,B进程不会退出。说到这,你可能懵逼了,什么是会话首进程,怎么看一个进程是不是会话首进程呢。首先,每个进程都会属于一个进程组,每个进程组有个

2021-03-23 20:30:02 4616

原创 linux双网卡同时访问内外网

场景很多公司的内网是个局域网,不允许外网访问。但是很多时候,我们既需要内网的资源,又需要同时访问外网。这个时候一台双网卡的设备就可以解决。操作一般情况下,/etc/network/interfaces文件保存了本机的网络配置信息。在该文件里设置外网外卡的相关网络配置,比如ip、网关、子网掩码等,但是不设置内网网卡的网络配置。这个时候你会发现设备可以正常访问外网,但是无法ping通局域网内的其他设备。为什么会出现这个情况?因为设备流量默认走外网的网关,自然也就无法到达局域网内的其他设备。那

2021-03-02 20:29:25 2451

原创 动态库so的版本兼容问题

现在的程序开发中,基本上我们都会依赖一些系统的或者第三方的动态库。如果我们将我们的可执行程序拷贝到一台新的服务器上,如果新的服务器上没有对应的动态库,那显然我们的可执行程序是无法运行的。这一点是显而易见的。复杂的情况是新的服务器上有这些动态库,但是动态库的版本不一样,我们的程序是否还可以运行呢?可能大部分人的答案是不行。那正确答案应该是什么呢?首先说明一下动态库的命名,一般情况下动态的命名采用libxxx.so.a.b.c,其中a代表大版本号,b代表小版本号,c代表更小的版本号。大部分的说法是只要大

2020-09-09 18:16:17 1706

原创 linux编译运行之动态库搜索路径

之前的文章讲了遇到cannot find lxxx报错的解决方案,今天系统的说下动态库搜索路径机制。动态库搜索分为两个时期:编译期和运行期。一、编译期1、通过-L命令指定。比如-L ./指定在当前目录下搜索动态库文件2、在LIBRARY_PATH变量中指定3、系统固定搜索目录:/lib、/usr/lib二、运行期1、编译时通过-Wl,-rpath指定2、在LD_LIBRARY_PATH变量中指定3、在/etc/ld.so.conf或者/etc/ld.so.conf.d/x

2020-05-28 16:16:56 418

原创 linux编译之头文件搜索路径

c/c++开发,一般开头都要include一堆头文件,那么在系统编译的时候,编译器是去哪儿寻找这些头文件?首先include有两种写法,一种是#include <xxxx>,另一种是#include "xxx"。这两种写法的区别是#include "xxx"会首先在当前目录下搜索头文件(不递归),如果找不到的话再去系统目录下寻找。而#include <xxxx>是直接去系统目录下寻找。下面具体来讲在系统目录下的搜索原则。搜索顺序是编译时指定的目录>环境变量指定的路径

2020-05-28 14:11:51 804

原创 docker学习之hello-world

近期学习了一下docker,来个hello-world练练手熟悉一下。1、安装dockerdocker安装比较简单,我是ubuntu18的系统,直接执行curl -fsSL https://get.docker.com/ | sh就可以安装,安装比较慢,大概需要2个小时左右。2、阿里云注册阿里云主要后面用来存放自己的镜像仓库。注册阿里云的账号并创建命名空间和镜像仓库。可以参见下图:3、拉取镜像使用docker镜像是必须得有的。看了一下官方就有最简单的hello-world镜像,那

2020-05-25 17:50:01 702

原创 ubuntu下ros安装

近期公司项目需要用到ros,所以决定在自己的虚拟机上安装ros做调试用。ros的安装操作基本按照https://www.cnblogs.com/hiram-zhang/p/10386598.html这个文档的操作进行,但是有些问题需要额外处理。1、执行sudo apt-get install ros-kinetic-desktop-full命令出奇的慢,得更换国内的源。http://wik...

2020-04-18 12:34:09 267

原创 虚拟机通过挂载windows目录编译程序的问题

记一个问题的解决过程,从中正好回顾一下linux的相关知识。问题是这样的,有一份代码在公司的服务器上编译没有问题,后来感觉经常要往服务器传代码编译有点麻烦,就想在自己的虚拟机上搭建一个编译环境。环境搭好之后,通过挂载的方式直接在虚拟机上访问本地windows下的代码进下编译,编译不过。问题可以精简成这样,有一个cpp名叫Termios.cpp,其代码包含了Termios.h这个头文件,而T...

2020-04-03 18:47:39 474

原创 ubuntu时间不对的解决方法

使用ubuntu系统,大家经常会碰到系统时间 不对的问题。时间不对一般分为2种,一种是系统时间和实际北京时间相差了几个小时,这个一般是系统时区设置的问题;另外一种系统时间和北京时间的差值为随机值。1、时区不对通过查看/etc/localtime可以看到本地的时区,如果时区不是上海可以新建一个软链接,改成上海时区2、非时区问题可以通过date命令修改时间或者通过ntpdate...

2020-04-01 10:12:22 4573

原创 编译程序时链接动态库so的一些问题

linux下开发程序,我们经常会调用第三方的动态库,大家可能经常会碰到cannot find lxxx类似的报错。这类报错一般有三个可能。第一种,电脑上没有相应的库,程序在链接的时候自然找不到该动态库。确认是不是这个问题非常简单,使用find命令搜索一下即可。若没有,安装对应的so程序即可。第二种,电脑上有相应的库,但是库所在的目录不在编译搜索的目录内。一般/lib和/usr/lib是...

2019-11-13 17:14:03 682

原创 ubuntu设置开机启动的一些方法

x11vnc开机启动之前在ubuntu14上安装过x11vnc,设置开机启动的方法如下: 创建/etc/init/x11vnc.conf文件 写入以下内容: start on login-session-start script /usr/bin/x11vnc -auth /var/run/lightdm/root/:0 -noxrecor...

2019-04-18 15:25:54 2755

原创 char、unsigned char与字面值比较的相关问题

最近做一个项目,定义了一个char数组,里面存放别人发送过来的消息。定义的消息头是0xff0xff,所以我收到消息后就与0xff进行比较,结果却发现不相等。看了一些资料,发现还是自己对基础知识的掌握不到位。首先,我写了个测试程序,代码及运行结果如下:void test_num(){ char a = 0x01; char b = 0xfe; unsigned c...

2018-09-30 09:22:08 2179

原创 QT显示中文问题

(本文内容参考了https://www.cnblogs.com/xgponder/p/4744168.html)。做QT开发的很容易会碰到中文乱码的问题,那么这个问题是如何发生的,又如何解决呢?首先描述一个现象:手里有两个前人的程序,一个部分代码如下:QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); ...

2018-08-23 14:22:19 469

原创 c/c++通过宏来控制打印

在做c/c++开发,经常需要打印一些内容以方便调试,但是又希望在开发之后不再打印这些调试信息。最麻烦的做法就是在开发时打印调试信息,在发布时再注释这些打印信息。或者也可以每句打印信息都添加一个ifdef的宏。那有没有什么相对简便一些的方法呢?1、c语言c语言一般用printf,方法如下://#define __DEBUG#ifdef __DEBUG#define DEBUG(f...

2018-08-10 16:46:19 2473

原创 apt-get 提示 无法解析域名“cn.archive.ubuntu.com” 的解决

今天用公司电脑(ubuntu)想使用apt-get安装一些软件,系统提示无法解析域名“cn.archive.ubuntu.com”。原因是dns没有配置,解决办法 加入dns服务器地址,比如:vi /etc/resolv.confnameserver 202.96.134.133nameserver 8.8.8.8但是使用该方法会发现重启电脑之后resolv.conf文件内容会还原。应该选择修改/...

2018-06-01 16:59:47 42933 19

原创 关于编码问题的若干总结

做程序开发,乱码问题应该是大家经常碰到的问题,最近本人看了很多资料,做了很多测试,故今日做个总结,既方便自己日后查看,也能帮助其他被此困惑的人。 1、编码方案分类大家一般比较常见的就是1、GB开头的,包括GB2312、GBK、GB18030。GB即国标的简称,专门针对中文编码,是目前比较流行的编码方案之一,一个汉字占两个字节。2、Unicode,包括UTF8、UTF16(BE/LE)

2017-11-16 15:13:34 255

原创 linux如何修改固定IP

新装的linux系统容易出现重启后ip地址发生改变的问题。本人所使用系统为ubuntun14.04和Red Hat Linux release 9 (Shrike),不同系统可能目录有所不同,请注意。 1、ubuntun14.04目录为/etc/network/interfaces.修改文件内容为 2、Red Hat Linu

2017-09-14 15:31:52 481

原创 编译时搜索头文件会不会搜索子文件夹

用gcc或者g++编译的时候,比如头文件会搜索1、当前目录 2、-I指定的目录 3、搜索gcc的环境变量CPLUS_INCLUDE_PATH(C程序使用的是C_INCLUDE_PATH)4、GCC安装的目录(可以通过gcc -print-search-dirs查询)5、/usr/include和/usr/local/include。 但是搜索这些目录的时候会不会搜索这些目录下面的子文

2017-08-07 17:50:23 2309

原创 vs2015执行vs2013程序缺少dll的问题

在家里用vs2013写了一个简单的测试dll的程序,测试ok。公司电脑装的vs2015,编译执行后会提示缺少dll文件,开始去官网下载了一个vs2013的插件安装,官方说法是vs2015使用vs2013必须装的插件。安装完成之后,仍然提示缺少UCRTBASED.dll、MSVCR120D.dll、MSVCP120D.dll,直接从网上下载相关dll文件,放置在系统目录下,再执行,提示成功。

2017-07-28 10:12:57 2852

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除