我们做开发的时候,比如需要调用api实现的一些功能,比如杀掉某个进程,获取当前进程列表(判断当前有无某个进程),或者注册服务,或者查找当前某个端口是否有被占用的时候。大部分都是通过获取api进行解决,查接口文档比如msdn,或者系统相关的接口看是否有可以实现功能的函数。但是我在这里讲解一下另外一种方法,希望对大家有用。
介绍这个之前先说一个在windows和linux上都有的东西,命令行管道。比如说:我想获取当前进程列表中是否有一个叫做chrome的进程。用Windows命令行可以这么写:tasklist /FO CSV | findstr "chrome.exe",linux应该是ps aux | less | grep "chrome",执行结果如下图:
Windows上情况(加入CSV格式化会让之后的处理方便一些,比如获取第一行之后直接split(",")[1]就可以拿到进程pid):
linux上情况(ubuntu自带firefox这里就用firefox了):
这样就可以根据输出判定某个进程存在,对于不存在的情况也很明显比如:
这样就会没有输出,大致原理就是这样。
就算是对于同名进程,也有命令行参数不一样可以区分当前进程具体是干嘛的,比如Wmic命令行,
转一篇文章:这里很好的对wmic命令行有介绍。(不知道为啥wmic对于管道的处理不支持,比如wmic process list | findstr "chrome"会得到一堆乱码)。
WMIC介绍博客:https://blog.csdn.net/swazer_z/article/details/60100596
常见Windows命令(windows上所有命令都可以/?,linux可以–help查看帮助文档,选择合适的参数指定功能):
netstat(端口相关,比如查找某个端口被占用很实用)
tasklist(进程列表相关)
taskkill(杀进程)
wmic(参见博客内容)
net(建立服务,用户管理配置等等,非常强大)
explorer(资源管理器,可供指定打开某一个目录)
rundll32.exe(可以通过指定打开文件方式打开文件)
…
对于不需要获取返回值的情况,可以简单ShellExecute(或者exec)+参数解决.
对于需要获取返回值并对返回值进行处理的时候,可以用管道执行程序(popen)
popen资料参考:
https://blog.csdn.net/stone8761/article/details/77498439
读取返回值进行分析.
Windows上也有专有的api可以实现读取命令行返回值的功能CreatePipe&ReadFile这样配合就能读取管道的输出.当然用popen也没有啥问题,只是字符集的问题在cmd下会出现乱码这个问题不太好解决.