c++
文章平均质量分 63
路边闲人2
混迹于csdn,不求显山露水,只求共享知识。
展开
-
C++去除string里的引号
必须使用std::remove()。如果引用了stdio.h。原创 2023-01-11 19:46:28 · 1415 阅读 · 0 评论 -
readdir不保证读取的文件顺序
在某些场景下需要注意,比如读取配置文件时,可能会根据配置文件进行一些初始化,但如果初始化时有些必须的内容还未初始化,可能出现问题。但是readdir并不保证读取后的文件顺序,在不同的操作系统上可能有不同的顺序。readdir用于读取某个文件夹中的全部文件或文件夹,相当于ls。如下所示:读取文件后,用sort进行排序。如果要实现排序可能要自行排序。原创 2022-11-29 17:07:36 · 1536 阅读 · 0 评论 -
Linux X86 程序启动 – main函数执行前,程序都在干什么?
目录一、目标读者二、覆盖范围三、调用过程分析3.1 main函数的调用3.2 _start函数分析3.3 __libc_start_main函数分析3.4 __libc_csu_init函数分析3.5 _init函数分析3.6 gmon_start函数分析3.7 frame_dummy函数分析3.8_do_global_ctors_aux函数分析3.9 回到__libc_csu_init__3.10 这是另一个函数的循环调用3.11 程序将返回__l.转载 2022-02-15 18:46:34 · 1413 阅读 · 0 评论 -
IEC61499开源项目FORTE部分源码分析
分析.fboot文件在FORTE中的解析和处理流程,理解软PLC的实现逻辑。区别于iec61131,比如OpenPLC的实现方式,OpenPLC是将PLC的逻辑变成中间语言的.st文件,再生成.cpp进行编译后生成 elf的可执行程序再进行执行的。.fboot文件在FORTE中是如何解析和处理的DEFINE_FIRMWARE_FB(FORTE_FB_RANDOM, g_nStringIdFB_RANDOM)宏展开后是这样的:..原创 2022-02-14 15:08:34 · 2389 阅读 · 2 评论 -
c语言中调用printf()后发生了什么?
最简单的hello.c#include <stdio.h>int main(){ printf("Hello, World!"); return 0;}运行结果:> gcc hello.c -o hello> ./helloHello, World!到底printf是如何将字符打印出来的呢,整个过程是如何实现的,还是有一点复杂的,请看:c : Where the printf() Rubber Meets the RoadAuthor.原创 2022-02-08 19:10:01 · 718 阅读 · 0 评论 -
4diac.forte 支持 OPC UA、MQTT、Modbus的方法
LinuxDownload the FORTE source from http://git.eclipse.org/c/4diac/org.eclipse.4diac.forte.git:$ mkdir ~/4diac && cd "$_"$ git clone -b develop https://git.eclipse.org/r/4diac/org.eclipse.4diac.fo.原创 2022-01-06 17:19:52 · 1341 阅读 · 0 评论 -
linux里用cmake安装的软件要怎么卸载?
linux里用cmake安装的软件要怎么卸载?找到安装目录的这个文件install_manifest.txt【make install 产生的文件】用命令读取并删除里面安装的所有文件的路径即可。参考命令:cat install_manifest.txt | sudo xargs rm...转载 2022-01-04 10:54:37 · 1556 阅读 · 0 评论 -
查看RISC-V版本的gcc中默认定义的宏
有些时候我们在编写代码或者阅读开源项目时经常会遇到一些陌生的宏定义,在找遍所有源代码都没发现其在哪里被定义过,这时这些宏定义很可能是系统编译器自己定义的。root@freedom-u540:~# gcc -vUsing built-in specs.COLLECT_GCC=gccCOLLECT_LTO_WRAPPER=/usr/libexec/gcc/riscv64-oe-linux/11.2.0/lto-wrapperTarget: riscv64-oe-linuxConfigured..原创 2021-12-18 10:10:26 · 1702 阅读 · 0 评论 -
RISC-V平台libc里面的setjmp和longjmp实现
libc从版本2.0开始,增加了对setjmp和longjmp的支持,这2个函数是实现协程的核心函数。我们来看一下RISC-V平台上这两个函数的底层是如何实现的。libc源码:https://sourceware.org/git/?p=glibc.git;a=summarygit clonehttps://sourceware.org/git/glibc.gitsetjmp/setjmp.h定义两个函数的原型setjmp(jmp_buf __env);longjmp(struc.原创 2021-12-18 09:50:10 · 1289 阅读 · 0 评论 -
如何学习和使用asio 网络库
asio是一个建立在Boost所提供的相关组件之上的异步的网络库,可以运行在Win/Linux/Unix等各种平台之上。不过随着C++11的发布,其对于Boost的依赖也越来越少,作者又做了一个不依赖于boost的版本。虽然网络上关于C++网络编程的框架和库的轮子多的一比,但没有一个比这个更通用,比这个更实用。 有些只能在linux上运行,比如muduo,有的依赖库非常多,比如360的evpp,有的只偏重于某一方面,不通用,比如不支持ssl。好用的大概只有asio这一个了。可惜关于asio的学习资料并不原创 2021-12-01 09:05:01 · 7433 阅读 · 0 评论 -
gcc -Werror的作用
在编译docker时出现了一个cast-align的错误,提示由于-Werror=cast-align引起的,但是编译命令里并没有这个项目编译命令:gcc -DHAVE_CONFIG_H -I. -I../../src -fPIC -DPIC -DLXCROOTFSMOUNT=\"/usr/local/lib/lxc/rootfs\" -DLXCPATH=\"/usr/local/var/lib/lxc\" -DLXC_GLOBAL_CONF=\"/usr/local/etc/lxc/lxc.c原创 2021-11-15 08:47:40 · 1707 阅读 · 0 评论 -
如何使 CPU使用率 保持在指定百分比?
#include <stdio.h> #include <stdlib.h> #include <time.h>#include <unistd.h>#include <sys/time.h>int main(int argc, char ** argv) { int percent = 50; if(argc > 1) percent = atoi(argv[1]); printf("se...原创 2021-06-16 15:12:10 · 2135 阅读 · 0 评论 -
C++11 chrono获取当前ms级精度的时间
https://www.delftstack.com/howto/cpp/how-to-get-time-in-milliseconds-cpp/获取当前epoch的ms值#include <chrono>#include <iostream>#include <sys/time.h>#include <ctime>using std::cout; using std::endl;using std::chrono::d...原创 2021-01-19 14:57:47 · 1178 阅读 · 1 评论 -
比较靠谱的SHA256、SHA1和MD5算法C++实现
C++程序中用到MD5和SHA1算法的情况是比较多的,自己写明显不靠谱,openssl库中的调用比较麻烦,网上有些人写的代码真心不靠谱。比如有的在intel平台工作就可以,到了mips平台就工作不正常了,算出来的值是错的。这里有个比较靠谱的C++代码实现SHA1,供大家参考https://github.com/vog/sha1https://github.com/xia-chu/ZLToolKit/blob/master/src/Util/SHA1.cpphttps://gith...原创 2020-12-16 11:22:42 · 1480 阅读 · 0 评论 -
c++ 依据编译时间输出版本号
如何在C++编译的程序中插入当前的时刻用于后续追踪此程序的版本?例如在程序的输出中输出version: v1.0, build time:20201201version.h#pragma once#include <string>namespace version { std::string get_build_time();}version.cpp#include "version.h"#include <stdio.h>...原创 2020-12-14 16:42:21 · 1133 阅读 · 0 评论 -
sqlite循环插入时使用stmt需要reset,否则会插入出错
sqlite正常的插入操作,在用到stmt时,如果要循环使用stmt,必须reset()如果不reset,直播再bind后step,则会出现未知状况,有可能某些情况下也是OK的,存储的数据也是正确的,但有些情况下数据是错乱的,比如第2行与第一行数据相同,或完全为空数据。示例代码见下,在一个for循环中,bind后step,之后必须reset(),否则,会数据保存出错。(血泪啊)std::string sql = "REPLACE INTO task_set values(?, ?, ...原创 2020-12-08 17:36:18 · 797 阅读 · 0 评论 -
c++循环创建文件夹
如果要创建一个目录 /www/live/cctv,但是当前并没有/www,需要用以下方式进行循环创建。bool createRecursionDir(std::string path){ if (path.length() == 0) return true; std::string sub; fixPath(path); std::string::size_type pos = path.find('/'); while (pos != std..原创 2020-11-04 19:19:50 · 714 阅读 · 0 评论 -
c++对ipv4和ipv6地址的兼容处理
目前ipv6的应用越来越广泛,慢慢将变成强制的标准,做网络应用开发的,在未来会越来越的要开始支持ipv6,但是ipv6肯定不是一下子就可以大范围应用的,必然有一段时间Ipv4与ipv6共存,要做到对ipv4和ipv6的同时支持。关于如何让程序支持ipv6可以参考 https://blog.csdn.net/v6543210/article/details/106927210示例代码见:https://github.com/alongL/ipv6_demo这个文章只讲如何兼容ipv4和...原创 2020-09-12 22:14:34 · 4017 阅读 · 0 评论 -
SRS-3.0拉流rtmp转hls 的过程
SRS是比较优秀的流媒体服务器。主要功能是接受媒体发布端的rtmp push,并发布。但是在目前的3.0版本中有ingest功能,即拉流转发。SRS作为客户端拉流后,进行媒体的分发。这在某些情况下非常有用。一、编译SRS具体编译按官方文档,非常容易。我的操作系统是ubuntu 18.04,即使centos差别应该也不大。二、编译ffmpeg拉流转发的内部是使用ffmpeg实现的,没有ffmpeg会导致拉流失败具体可以参考https://github.com/ossrs/s..原创 2020-08-21 10:29:17 · 3828 阅读 · 0 评论 -
windows下zlib库的编译与使用
一、zlib库的编译首先要下载这个库,这个谷歌和百度也都可以找得到的。我下载的是zlib-1.2.11,下载完解压出来即可。下边就开始编译吧。(包括动态库和静态库两种)http://zlib.net/zlib-1.2.11.tar.gzzlib的vssln解决方案文件可以在如下路径中找到:zlib-1.2.11/contrib/vstudio/vc14/zlibvc.sln,打开这个解决方案中包含6个工程。其中:(1).zlibvc生成动态链接库zlibwapi.dll和对应的导入库z...原创 2020-08-19 16:09:49 · 4653 阅读 · 0 评论 -
easylogging 用法和不输出日志的问题解决
1.用法基本用法如下,引用头文件,添加初始化宏,配置log的文件名,配置Log的格式,再写入log写入log的时候,可以使用LOG(INFO) <<这样的格式,也可以使用printf类的格式,但是要注意:printf格式只能用%v,不能使用%s, %d这些。否则此条日志不会有任何输出。 LOG(INFO) << "Here is very simple example."; #include "easylogging++.h"INITIALIZE_EA.原创 2020-08-17 16:45:12 · 3386 阅读 · 0 评论 -
htonll 在linux上的实现
64位字节序转换函数htonll是windows平台上的函数,Linux平台下示提供此函数,这个地址提供了一个非常漂亮的函数,但是存在一些不足,没有进行本机的字节序判断,如果本机也是大端,那么,应该做的是不进行任何转换,直接输出,而这2个函数此时会出错https://blog.csdn.net/jakejohn/article/details/90400411uint64_t htonll(uint64_t val){ return (((uint64_t) htonl(val))...原创 2020-08-11 18:19:01 · 3733 阅读 · 0 评论 -
基于c++11 的filesystem库
一般程序设计都有访问文件系统的需求,什么列出目录啦,删除,创建目录啦,自己写老费劲了,又要考虑跨平台实现,费心伤神。c++17把这个给统一了,加了个filesystem,但是对于不想用或不能用c++17的人就麻烦了。这里有个轮子可以拿去用,基于c++11实现,与c++17兼容。非常好用。项目地址:https://github.com/gulrak/filesystem/使用示例:参见https://github.com/gulrak/filesystem/blob/mast...原创 2020-08-07 18:34:52 · 7300 阅读 · 0 评论 -
c++ 数字转字符串如何前导补0,一行代码就搞定
对于数字,int转string时经常需要补0,比如日期0201,2月1日。或序列号0001。int n_zero = 4;string old_string = "2";std::string new_string = std::string(n_zero - old_string.length(), '0') + old_string;注意不要让n_zero小于 old_string长度,否则unsigned int会让你崩溃。https://stackoverfl...原创 2020-07-30 15:00:33 · 11372 阅读 · 1 评论 -
c++ hls协议 m3u8解析器
hlsparser.h#ifndef HTTP_HLSPARSER_H#define HTTP_HLSPARSER_H#include <map>#include <list>#include <string>typedef struct{ //url地址 std::string url; //ts切片长度 float duration; //////内嵌m3u8////// //节目id ...原创 2020-07-30 00:06:24 · 3343 阅读 · 0 评论 -
c++获取可执行程序的exe名称
https://github.com/xia-chu/ZLMediaKit/blob/master/src/Common/config.cppstring exePath() { char buffer[PATH_MAX * 2 + 1] = { 0 }; int n = -1;#if defined(_WIN32) n = GetModuleFileNameA(NULL, buffer, sizeof(buffer));#elif defined(__MACH..原创 2020-07-29 14:21:22 · 2376 阅读 · 0 评论 -
如何让C++程序代码支持IPv6?
IPv6是英文“Internet Protocol Version 6”(互联网协议第6版)的缩写,是互联网工程任务组(IETF)设计的用于替代IPv4的下一代IP协议,其地址数量号称可以为全世界的每一粒沙子编上一个地址。推动ipv6的一个重要目的是为了解决ipv4地址不足的问题。目前苹果已经要求新上架的app必须支持ipv6only,国内各大运营商也对ipv6进行了一定程度的支持。国家也对ipv6的发展有许多的推动政策(详见https://www.china-ipv6.cn/#/index),..原创 2020-06-23 17:39:46 · 4727 阅读 · 2 评论 -
一个openssl与网络库结合的例子
https://github.com/xiongziliang/ZLToolKit/是一个用于流媒体服务器的网络库,内部集成了openssl实现的https等,非常值得需要实现https的人进行参考,这个项目是实际项目中使用的项目,稳定性应该还是比较好的。具体ssl相关实现在 :https://github.com/xiongziliang/ZLToolKit/blob/master/s...原创 2020-04-08 19:13:12 · 260 阅读 · 0 评论 -
const函数与非const函数在不同情况下的调用情况
看下面的例子,输出什么?#include <iostream>using namespace std;class Good {public: Good() { i = 0; } int f() { return i; }; int f() const { return i+1; }; int i;};int main(){ Go...原创 2020-04-03 11:34:13 · 317 阅读 · 0 评论 -
ZLMediaKit在linux平台下编译运行
ZLMediaKit是一个基于C++11的高性能运营级流媒体服务框架,项目地址:https://github.com/xiongziliang/ZLMediaKit项目特点基于C++11开发,避免使用裸指针,代码稳定可靠;同时跨平台移植简单方便,代码清晰简洁。 打包多种流媒体协议(RTSP/RTMP/HLS/HTTP-FLV/Websocket-FLV),支持协议间的互相转换,提供一...原创 2020-03-13 19:01:29 · 7298 阅读 · 2 评论 -
muduo网络库的快速学习方法
muduo是由陈硕开发的一个Linux多线程网络库,采用了很多新的Linux特性,项目代码量不到5000行,性能也不错。是难得的一个既能用来学习,也可以在实际生产环境中使用的网络库。地址https://github.com/chenshuo/muduo相关介绍可以见https://www.cnblogs.com/CodeComposer/p/4719783.html由于此网络库只支...原创 2020-03-06 16:18:58 · 969 阅读 · 0 评论 -
为muduo添加openssl支持
在面试“xx出行”的时候,被问到ssl socket的实现,当时没有做过,后来有机会接触到这一点了,经过一段时间的学习和测试,终于将这一点做出来了。分享给大家。网上具体的资料并不多,不过好在有几个好的demo可以参考。一般来讲,实现ssl socket的方法是使用SSL_read和SSL_write等函数,例如https://github.com/yedf/openssl-exampl...原创 2020-02-18 17:20:22 · 824 阅读 · 3 评论 -
为muduo添加openssl支持
在面试“xx出行”的时候,被问到ssl socket的实现,当时没有做过,后来有机会接触到这一点了,经过一段时间的学习和测试,终于将这一点做出来了。分享给大家。网上具体的资料并不多,不过好在有几个好的demo可以参考。一般来讲,实现ssl socket的方法是使用SSL_read和SSL_write等函数,例如https://github.com/yedf/openssl-exampl...原创 2020-01-14 00:10:02 · 135 阅读 · 0 评论 -
c++获取文件的修改时间
跨平台,linux和windows平台都可以编译#include <sys/types.h>#include <sys/stat.h>#ifndef WIN32#include <unistd.h>#endif#ifdef WIN32#define stat _stat#endifint64_t get_mtime(){...原创 2019-12-09 19:32:35 · 3776 阅读 · 7 评论 -
mysql 预处理stmt操作(写入数据库和从数据库中取出)
stmt操作stmt对于多次执行的语句比直接执行快,主要原因在于,仅对查询执行一次解析操作。在直接执行的情况下,每次执行语句时,均将进行查询。此外,由于每次执行预处理语句时仅需发送参数的数据,从而减少了网络通信量stmt主要的介绍可以参考:https://blog.csdn.net/zhouxinfeng/article/details/77891771主要的操作是将MYSQL_B...原创 2019-11-24 00:46:08 · 10521 阅读 · 0 评论 -
asio学习之udp client
同步的:#define ASIO_STANDALONE #define D_WIN32_WINNT 0x0501#include <string>#include <asio.hpp>#include <iostream>using namespace std;using namespace asio;int main(...原创 2019-11-16 23:45:33 · 853 阅读 · 0 评论 -
asio学习之 UDP服务器
想找一个好的c++网络库,选来选去都不太满意,mudo不支持windows,也不支持UDP,evpp 有点复杂,libevent是C语言的,最后感觉还是asio最完善,支持最好,据说c++20标准中可能标准化,所以就进行一些学习。1.基本使用需要定义 ASIO_STANDALONE 单独使用asio不使用boost的。windows平台下要定义_WIN32_WIN...原创 2019-11-16 23:43:04 · 2208 阅读 · 1 评论 -
通用的Makefile
一个通用的Makefile写法,可以自动将当前的.cpp作为编译目标,自带clean,使用时只需将程序名称、库和头文件等改一下即可正常工作。XX = g++CXXFLAGS = -std=c++11 -c -g CLIBS = -L../../lib/linux -lssl INCLUDE_DIRS = -I../../include SRC=$(wildc...原创 2019-11-15 14:37:01 · 128 阅读 · 0 评论 -
c++11 json解析库nlohmann/json.hpp使用方法
json for modern c++是一个德国大牛nlohmann写的.地址https://github.com/nlohmann/json解析字符串的方法是:1. 在字符串末尾添加 _jsonusing namespace nlohmann;auto j2 = R"({"happy": true, "pi": 3.141, "ren":"good"})"_jso...原创 2019-11-12 15:51:46 · 17884 阅读 · 13 评论 -
Linux根据程序名称获取pid
#include <sys/types.h>#include <dirent.h>#include<unistd.h>#include <sys/stat.h>#include <limits.h>#include <stdio.h>static int getPidOfProgram(con...原创 2019-11-12 12:14:00 · 446 阅读 · 0 评论