在做项目的过程中,遇上的问题,记录一下。有一个程序getCode.exe需要开机自启动,这个程序是有一些用户交互的。
一开始的时候,我这边直接使用nssm创建服务,开机自启动这个服务,拉起来getCode.exe,但是发现,getCode.exe开机自启动之后,居然对用户的输入毫无反应;但是如果是电脑开机之后,手动启动getCode.exe程序,就可以正常接收用户输入并作出后续操作。
于是开始从网上找各种信息排查,发现网友提到了会话ID,于是打开任务管理器去确认,发现如果是通过nssm直接创建服务拉起来的getCode.exe进程的会话ID是0,但是如果在开机后手动启动getCode.exe的会话ID是1,而开机后的当前用户的会话ID就是1,经过确认,就是会话ID导致的问题。
于是我们需要再写一个程序setExeSID.exe,这个setExeSID.exe主要负责的就是以指定的会话ID来启动getCode.exe程序,然后将setExeSID.exe通过nssm创建服务开机自启动,当服务开机自启后,拉起来setExeSID.exe,此时setExeSID.exe进程的SID为0,然后setExeSID.exe这个进程再指定以SID为1启动getCode.exe,这样的话,getCode.exe既实现了开机自启动,又实现了开机启动后SID是1(和当前登录的用户的SID)保持一致,可以和用户有输入输出的交互。
简单的说,用户登陆到windows系统之后,不管该用户是本地登陆的,还是远程登陆,系统都会为这个用户分配一个新的会话ID(SID)。也就是说会话与用户的登录是相关连的,没有用户登录就不存在会话。因此,会话的含义是指用户登录之后的一种运行的环境。
打开“任务管理器”–》“查看”–》“选择列”–》“会话ID”前的方框打钩,即可在任务管理器查看到每个进程的会话ID

主要使用到的函数如下:
1 |
|
session 0会话隔离的问题,在这个项目之前,虽然有一点耳闻,但是在一开始排查这个问题的时候,确实没有往这个方向上想,后来也是查了很多资料之后,才把问题的方向转向这个思路。经过这次,可以说,当windows上开发应用程序时,如果需要这个应用程序开机自启动,而且这个程序又在启动后需要有用户交互,那么就需要考虑会话隔离的问题。
关于突破SESSION 0隔离创建进程
https://cloud.tencent.com/developer/article/1424933
这个链接下总结了用户权限设置和进程权限提升,讲的很细致,提权demo也可参考
https://blog.csdn.net/yockie/article/details/17029293
这个链接下,总结了window API
http://yfvb.com/help/win32sdk/index.htm?page=html/_qx5ll.htm
在代码开发过程中,内存泄露问题是一个让人排查起来很头疼的问题,这种bug有时候会非常隐蔽,当代码量很大的时候,有时候直接推理排查会花费大量时间精力,还有可能漏掉,此时可以通过一些小工具来排查代码里的内存泄露问题,linux下,可以通过valgrind工具来检查代码里的内存泄露问题
官网下载地址: https://www.valgrind.org/downloads/current.html
1 | //解压 |
至此,valgrind的安装及环境配置已完成,操作过程如下图:








main.cpp如下
1 |
|
直接编译即可:
1 | g++ main.cpp |
调试指令如下:
1 | valgrind --log-file=./valgrind_report.log --leak-check=full --show-leak-kinds=all --show-reachable=no --track-origins=yes ./a.out |
–log-file
指定报告输出文件
–track-origins=yes
是否显示未定义的变量,在堆、栈中被定义没有被initialised的变量都被定义成origins。默认是关闭这个option的。
–show-leak-kinds=all
这里可以支持的选项有[definite|possible],一般只需要去关注definite(必须关注),possible是可能会存在。
–leak-check=full
当服务器退出时是否收集输出内存泄漏,选项有[no|summary|full]这个地方我们将其设置成全输出,默认将会使用summary方式。
之后就可以查看生成的报告valgrind_report.log,分析是否有内存泄露,及问题定位
本次代码检查如下:

在linux下排查内存泄露问题时,如果项目复杂,代码量大,可以考虑使用valgrind工具来协助排查
树莓派本身安装了64位系统的情况下,需要配置32位程序的运行环境,首先安装依赖库,操作步骤如下,以下操作都要在root用户下进行
git clone git://github.com/raspberrypi/tools.git
将arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/路径下的lib库都拷贝到/usr/local/lib32路径下,这个路径可以自己创建,自定义路径名,专门用来存放底层32位依赖库(如libstdc++.so.6)
其实最重要的,就是从官方提供的交叉编译工具链,把32位库给获取到,然后放到树莓派的自定义路径下,之后自己编译的32位执行程序/库,都要指定链接这个路径的基础库,否则会报错(找不到依赖库)
本身64位的树莓派系统是不带32位基础库的,所以必须从官方的交叉编译工具链里获取(目前,无法通过apt-get直接获取到所有的32位依赖库)
在终端进行如下操作即可:
sudo passwd root
然后根据提示输入root用户的密码
再重复输入一次刚刚设置的密码
切换root用户操作如下即可:
su -
输入设置的root用户的密码
操作如下即可:
sudo vim /etc/ssh/sshd-config
修改 PermitRootLogin yes
然后保存修改
然后执行sudo systemctl restart ssh
再通过ss -tnl查看是否开启成功即可
在需要无线网络连接的情况下,配置eth0的静态ip如下:
sudo vim /etc/network/interfaces
然后再文件里增加以下内容
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.0.1 //IP地址
netmask 255.255.255.0 //掩码
然后保存
但是此时,如果不设置一下wlan0,那么会发现虽然静态ip设置成功了,但是树莓派却无法联网了
所以还要在interfaces文件里追加以下内容
auto wlan0
iface wlan0 inet dhcp
wpa_conf /etc/wpa_supplicant/wpa_supplicant.conf
然后保存
退出文件
重启树莓派即可
https://www.raspberrypi.org/software/raspberry-pi-desktop/
通过官网,下载raspberry镜像64位系统iso文件之后,可以安装在虚拟机vbox/vmware里
通过github下载最新的官方树莓派交叉编译工具链
git clone git://github.com/raspberrypi/tools.git
将arm-bcm2708文件夹拷贝到/opt/arm-bcm2708下(自定义路径即可)
将上面到交叉编译工具链的路径配置到~/.bashrc文件
1 | sudo vim ~/.bashrc |
输入以下指令,如果有打印一些版本信息,那么说明交叉编译环境配置正确
arm-linux-gnueabihf-gcc -v
如图:
如果报错提醒如下:
可以按照以下的解决方案尝试一下:
然后重新输入arm-linux-gnueabihf-gcc -v即可发现打印版本信息
demo略,编译的指令如下:
需要注意的是,该可运行文件不能在PC机上运行,只能在树莓派arm板子上运行
到此为止,虚拟机上的树莓派arm的交叉编译工具链搭建完成,这个官方的交叉编译工具链还是很靠谱的
下载镜像参考以下网址
https://www.jianshu.com/p/1a65cb0b8f58
下载安装交叉编译链参考以下网址
https://www.cnblogs.com/zfyouxi/p/3831769.html
因为在mac下下载了rar文件,需要解压,然而mac上默认没有rar解压环境,于是配置了一下命令行rar/unrar环境
1 | //下载地址如下 |
1 | //找到刚刚的更新包路径,然后cd到这个路径下,在命令行输入 |
1 | sudo install -c -o $USER rar /usr/local/bin |
如下图所示,先点击解锁,然后输入密码,然后准许rar软件包
(因为我这边已经准许过了,所以这里现在是空,差不多就是这个位置)
1 | //解压 |
不得不说,mac下的安全管理还是严格的
本次案例demo来自《大话设计模式》一书,是C++版本的实现
设计一个简单的计算器,可以进行加减乘除功能
完整源码已同步到github上
地址:https://github.com/TreeAndFlower/sampleFactory.git
1 | class baseCalculate{ |
1 | cd build |
即可生成可执行文件sampleFactory,执行后即可看到如下效果:
在学习《大话设计模式》中,为了加深学习效果,因此用C++实现一遍文中的java案例,仅是学习笔记
tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent:
meta: false
pages: false
posts:
title: true
date: true
path: true
text: false
raw: false
content: false
slug: false
updated: false
comments: false
link: false
permalink: false
excerpt: false
categories: false
tags: true