零碎
C变量存储
静态存储区 : 不受人为控制,编译期更具变量大小分配 生命周期等于程序运行时期
静态变量 常量 全局变量
2023年11月14日
9:11
#ifdef 嵌套使用 内部要用 #if
高位低位 16 进制 移位操作
计算 两个值存储
Int= Int << 16
Int = Int | int 用 或 代替 相加
高位 0xffff0000 & int
低位 0x0000ffff & int
常用 c 函数
memset 初始化数据
strcpy 复制数据 改用strncpy 第三个参数是目标容器的size
strcat 追加数据
strcmp 比较字符串相等 0 相等
strstr 是否包含某个字符串 true 第一个包含的地址 false : -- null
memcpy 内存拷贝 。
fprintf 函数 格式化输出数据 可用于拼接替换字符串。改用 fnprintf
linux 开发注意点
linux 下CALLBACK 需要定义为空 如 #define CALLBACK 因为CALLBACK 对应的是 _stdcal 这是一个回调规范 而在linux 没有对应的替换
使用goto 关键词 时要注意 变量声明的地方 防止跳过变量声明的地方
linux系统中有个符号链接:/proc/self/exe 它代表当前程序,所以可以用readlink读取它的源路径就可以获取当前程序的绝对路径
#ifdef SDK9000_EXPORTS
#define ExportSDK9000_API __declspec(dllexport)
#else
#define ExportSDK9000_API __declspec(dllimport)
#endif
此段代码意思为 导入导出函数标记 在window 下开发使用
这个是为了 找得到 向外界提供static 变量时避免找不到。可以不用。
搭建镜像环境
/opt/router_manager/ libs_config.json 添加 。so文件
内存泄漏注意
开辟和关闭的内存要相对应 有开辟就要想到在哪里关闭 ,线程内存容易忽略应多关注
内存开辟最好在同一层内关闭 同层逻辑不要管理上下层的数据
Ifdef 是判定是否定义
Ifndef 判断是否未定义
Sizeof 不可用来当作数组的容量大小 要除相应的数组类型的大小
如 sizeof(int[])/ sizeof(int)
window
#pragma comment(lib,"PlaySdkM4.lib")
win10 开启共享要开启SMB 服务。
HINSTANCE hin; //动态加载dll库函数
hin = LoadLibrary(L"delltestdll.dll"); DLL 文件使用
addp add = (addp)GetProcAddress(hin,"add"); / addp 是定义的函数指针
win+r eventvwr // 查看系统日志
编译 提示未定义
在项目中编译 定义环境变量 切换目录编译需要 定为完整路径
Export =/home/lly2/lib/x86_64-linux-gnu
malloc 和 calloc 区别
函数malloc()和函数calloc()的主要区别是前者不能初始化所分配的内存空间,而后者能
在代码中 所谓的封装 其实是开辟一个空间 然后返回该空间的地址 然后后续的功能函数 将该地址传递过去, 强制转换为该空间对应的结构体 , 然后对该结构体进项操作 ,这中 操作 大大减少了 对零碎函数的理解 ,不用关注内部的逻辑 ,只需要注意函数外部调用即可
Sh 脚本无法执行
-bash: ./auto_get_dz_test.sh: /bin/bash^M: bad interpreter: No such file or directory
dos2unix auto_get_dz_test.sh
Linux 命令
2023年11月14日
9:08
/** *******************gdb 简单调试**** /
gdb ./interver
r
bt 查看栈
f 跳栈
q // 退出
b on_tcp_client_read_ihorn_data // 打断点
b ExportSDK9000PRO.c:180 // 某行打断点 。。
p 变量 // 打印变量内容
c // 继续运行 到达下一个断点
n // 逐行调试
t 跳线程。
info b 查看断点
delete b 删除断点
thread apply all bt // 全部多线程的信息
gdb febolaqi core / / 查看core 文件
Pidof 进程号
Gdb attch 进程号 可直接进入该进程的gdb 调试
pidof 命令用于检索指定的命令,返回相应的进程ID gdb attach 32133 (进程号)可以切入gdb调试
x/20c 0x7f06dac29d40 - 20 打印地址前的20个字符
netstat -antp | grep 29999 // 查看端口占用
netstat -apn | grep 6001 查看端口占用
kill -9 进程号 // 消灭进程
export LD_LIBRARY_PATH=./ // 设置共享库路径
find "/" -name "*.cpp" // 查找文件
locate router_config.xml // 查找文件
gcc -fPIC -shared func.c -o libfunc.so //GCC 生成动态链接库
gcc main.c libfunc.so -o app.out // GCC 将动态链接库链接到可执行文件
g++ nn.cpp -I ./inlude/ -L ./sdk/ -lpthread -lnvssdk -o nn // g++编译
gcc ngx.c -o ngx // gcc 编译
tail -f 日志文件 // 动态查看日志
tar -zcvf filename.tar.gz directory_name // 压缩文件
tar -xvf filename.tar.gz -C directory_name // 解压文件到指定目录
unzip -o xxx.zip 解压zip
mount -t cifs -o username=10755,password=td10755 //10.20.30.30/demo_code lly // 挂载
unmount lly // 卸载
df -h // 查看挂载。
umount -l / (立即断开挂载) umount 目标忙时用
firewall-cmd --zone=public --add-port=9001/tcp --permanent // 添加端口号
firewall-cmd --permanent --zone=<zone_name> --add-port=8000-8010/tcp --permanent
firewall-cmd --reload // 重启防火墙
tcpdump -i ens33 host 10.20.31.53 -s 0 -w /root/lly.cap // 抓包
tcpdump -i ens33 host 10.20.31.31 -s 0 -w /opt/lly.cap
tcpdump -i any host 10.20.31.31 -vnn -A 抓包并显示。
ifconfig 网络
chmod 777 -R * // 修改目录下所有文件文件权限
strace 【命令】 查看命令运行
usr/bin/ld cannot find * 解决 find / -name "libaes.so" //找到lib 库文件 然后 复制到生成库的位置。
vim xxx.sh set ff=unix wq //window 下编写的sh 文件 无法再unix 下执行 解决
ld xxx.so // 查看so文件链接
pidof x1
lsof -p 2577352 | grep libStreamConvertor.so 查看库是否加载
pstack 639915 > "test_pstack_100" 查看线程个数 输出到文件
软连接
ln -s dir newFile
对外库的版本信息查看
strings so名 | grep version
grep -Ern "要找的ip" 可能存在此ip的文件
ln -s 源文件 新链接 // 创建软啊链接
Which 筛选命令
md5sum libnvssdk.so 查看 md5 值
sudo date 091314302023 // 设置date 日期
sudo hwclock --systohc //date写入硬件