Linux Qt编程——在程序中启动其他应用、脚本
来源:互联网 发布:数据化工具 编辑:程序博客网 时间:2024/05/16 13:04
我们在编程过程中,经常会遇到这样的需求,点击一下按钮,启动另外一个应用程序,或者执行一个脚本。你一定觉得这个多简单啊,有什么可写的?其实实现同一个功能,不同的开发人员写出的代码可能千差万别,执行效率,容错率,是否有唯一启动保护等……当然,我们还是需要通过衡量具体的需求和环境来设计自己的代码,量体裁衣。
最简单的,我们可以通过system直接启动一个应用程序或者脚本:
system("./helloworld");system("./hello.sh");
操作简单,但是我们可以很清晰的看到弊端:虽然很顺利的匹出一个进程去执行另外一个应用,但是我们拿不到这个新进程的任何东西,也就失去了对这个进程的控制权。所以我们可以尝试利用QProcess:
void Widget::startApps(QString str){ QProcess *proc = new QProcess(); proc->start(str); }
拿到proc指针,我们可以做一些我们想做的事情。做嵌入式应用编程的朋友可能时常会受到环境变量的困扰,很纳闷为什么总是找不到这库那库。所以我们可以再完善一下:
void Widget::startApps(QString str){ QProcess *proc = new QProcess(); proc->setEnvironment(proc->environment()); proc->start(str); proc->waitForStarted(); }
如果我们想要执行的脚本需要传参呢?我们有必要完善一下参数列表:
void Widget::startSh(QString str){ QString program = "./hello.sh"; QStringList arguments; arguments << str; QProcess *myProcess = new QProcess(); myProcess->start(program, arguments);}
system("ps | grep helloworld |grep -v grep || ./helloworld &");
如果你还不熟悉脚本语言,那么我很乐意解释一下:ps查看系统进程信息,grep检索一下helloworld相关的进程,然后排除掉grep本身这个进程,如果已经存在一个helloworld,那么不进去执行,如果没有存在helloworld,就启动一个helloworld。即完成了单一启动保护处理。
如果你需要必须保证启动一个新的helloworld,那么依旧有好办法,先杀掉可能存在的helloworld,然后再启动,无声无息:
system("killall helloworld");如果不确定应用名字就是helloworld,我们只需要把命令替换成:
ps aux | grep helloworld | grep -v grep |awk '{print $2}' | xargs kill 2&> /dev/null
需要提醒的是,根据ps的输出,找到pid那一列,如果在第一列,则改成print $1 ,Busybox可能会存在差异所以要注意。
待续……
- Linux Qt编程-在程序中启动其他应用、脚本
- Linux Qt编程——在程序中启动其他应用、脚本
- Linux Qt编程——在程序中启动其他应用、脚本
- Linux Qt编程——在程序中启动其他应用、脚本
- Linux Qt编程——在程序中启动其他应用、脚本
- Linux Qt编程——在程序中启动其他应用、脚本
- iOS在程序中启动其他应用
- Android 在应用中启动其他应用
- android 在应用中安装其他程序
- android 在应用中启动其他应用Intent的写法
- 如何在程序中启动其他程序(1)
- 如何在程序中启动其他程序(2)
- 在MFC程序中启动其他的exe程序
- 如何在MFC程序中启动其他的exe程序
- 在MFC程序中启动其他的exe程序
- linux中程序/脚本启动方式小结
- linux中程序/脚本启动方式小结
- Android 应用中启动其他应用 && 在页面中寻找其他页面的控件
- wec7 Shaders.dll 找不到的错误
- 应用的安装,启动和删除
- ie浏览器调用dll中的资源
- 使用UIPickerView需要注意的问题时候
- IE8上传文件时javascript取文件的真实路径的问题("C:\fakepath\xxxxx )
- Linux Qt编程——在程序中启动其他应用、脚本
- 【C++ STL】细数C++ STL 的那些事---map容器
- Java学习第四天
- list_add_tail 添加双向链表结点讲解
- 临界区域问题
- CSDN 上的广告越来越多了
- Android自定义控件之组合控件
- 配置,链接access数据库
- AfxMessageBox