1.最简单的,我们可以通过system直接启动一个应用程序或者脚本:(但是要调用  #include <stdlib.h>)
system("./helloworld");  //可以直接运行可执行文件
system("./hello.sh");  //也可以直接运行脚本

技巧: system 函数参数是char* 如果正确返回0。

2.  操作简单,但是我们可以很清晰的看到弊端:虽然很顺利的匹出一个进程去执行另外一个应用,但是我们拿不到这个新进程的任何东西,也就失去了对这个进程的控制权。所以我们可以尝试利用QProcess:

QProcess *workPacePath  = new QProcess();
workPacePath->start("pwd");
connect(workPacePath,SIGNAL(readyReadStandardOutput()) ,this, SLOT(workPacePathSlot()) );

这样就能通过槽函数读取第三方可执行程序的输出了(但是前提 workPacePath设置全局的)

void MainWindow::workPacePathSlot()
{
QString workPacePathTemp = workPacePath->readAll();
Singleton::workPacePathGlobal =workPacePathTemp.mid(,workPacePathTemp.length()-); // /home/alvin/code/keysiQt/
qDebug() << "工作空间:" << Singleton::workPacePathGlobal << endl;
}

拿到proc指针,我们可以做一些我们想做的事情。做嵌入式应用编程的朋友可能时常会受到环境变量的困扰,很纳闷为什么总是找不到这库那库。所以我们可以再完善一下:

QProcess *proc = new QProcess();
proc->setEnvironment(proc->environment());
proc->start(str);
proc->waitForStarted();

如果我们想要执行的脚本需要传参呢?我们有必要完善一下参数列表:

QString program = "./hello.sh";
QStringList arguments;
arguments << str;
QProcess *myProcess = new QProcess();
myProcess->start(program, arguments);

项目中,我们经常遇到这样的情况:模块一单独工作正常,模块二单独工作也正常,但是整合到一起,在特定的环境下就出这样那样的问题。举一个启动应用程序的例子:进程间通信很容易出错,进程A发送启动helloworld的消息给进程B,进程B接到消息就启动helloworld。进程A只发送一次消息,但是进程B却接到2个发送任务,连续启动2个helloworld,这种错误很致命,尤其是在内存紧张的环境下,但是的确不容易排查。所以,为了避免悲剧的发生,哪怕我们不能准确的定位进程间通信的错误根源,聪明的程序员依旧可以解决这个问题:

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 &> /dev/null 

需要提醒的是,根据ps的输出,找到pid那一列,如果在第一列,则改成print $1 ,Busybox可能会存在差异所以要注意

qt 程序中执行额外程序和脚本的更多相关文章

  1. 在Web应用程序中执行计划任务(多线程)

    在业务复杂的应用程序中,有时候会要求一个或者多个任务在一定的时间或者一定的时间间隔内计划进行,比如定时备份或同步数据库,定时发送电子邮件等,我们称之为计划任务.实现计划任务的方法也有很多,可以采用SQ ...

  2. Delphi 如何在程序中执行动态生成的Delphi代码

    如何在程序中执行动态生成的Delphi代码 经常发现有人提这类问题,或者提问内容最后归结成这种问题 前些阵子有位高手写了一个“执行动态生成的代码”,这是真正的高手,我没那种功力,我只会投机取巧. 这里 ...

  3. 如何在程序中执行动态生成的Delphi代码

    如何在程序中执行动态生成的Delphi代码 经常发现有人提这类问题,或者提问内容最后归结成这种问题 前些阵子有位高手写了一个“执行动态生成的代码”,这是真正的高手,我没那种功力,我只会投机取巧. 这里 ...

  4. shell脚本中执行另一个shell脚本

    分类: 可以在一个shell脚本中执行另一个shell脚本(或非可执行文件,主要用于取得一些变量的值),方法是: . 文件名(包括路径) 或 变量=文件名(包括路径) . $变量   注意,圆点后面有 ...

  5. crontab中执行java程序的脚本

    测试场景说明(操作系统:centos7): 有一个bash脚本,脚本内容是执行某个java程序,该脚本为 /data/project1/start.sh crontab -e,添加了以下任务: * * ...

  6. 在c++程序中执行DOS命令

    转自博客:http://blog.csdn.net/ypist/article/details/8485049 #1,system()方式 在C盘根目录下新建文件夹,名称为12: system(&qu ...

  7. 如何在交互式环境中执行Python程序

    相信接触过Python的小伙伴们都知道运行Python脚本程序的方式有多种,目前主要的方式有:交互式环境运行.命令行窗口运行.开发工具上运行等,其中在不同的操作平台上还互不相同.今天,小编讲些Pyth ...

  8. 【python之路2】CMD中执行python程序中文显示乱码

    在IDLE中执行下面代码,中文显示正常: # -*- coding:utf-8 -*- st=raw_input("请输入内容")print st 但在CMD中执行e:\hello ...

  9. 区分execl与system——应用程序中执行命令

    execl:相关函数:fork, execle, execlp, execv, execve, execvp表头文件:#include <unistd.h>函数定义:int execl(c ...

随机推荐

  1. 秒懂AOP

    AOP(Aspect Orient Programming),作为面向对象编程的一种补充,广泛应用于处理一些具有横切性质的系统级服务,如事务管理.安全检查.缓存.对象池管理等.AOP 实现的关键就在于 ...

  2. HTML meta头部小结

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. python自动化开发-4

    装饰器之我见 python里的装饰器到底是个什么东东,初看起来,可能有的小伙伴会发懵啊,哈哈. 先来个装饰器的例子瞅瞅: Author:RYB # __*__coding:utf-8__*__ ''' ...

  4. C# 插件式开发

    在网上找了下插件式编程的资料,这里自己先借鉴下别人的,同时发现有自己的看法,不过由于本人水平有限,不一定有参考价值,写出来一方面是为了总结自己,以求提高,另一方面也希望各为朋友看到我的不足,给我提出宝 ...

  5. SQLServer Management Studio登录框中的“服务器名”填写

    SQL Server Management Studio登录框中的“服务器名”填写 by:授客 QQ:1033553122 打开MSSQL Management Studio,如图,登录框中怎么填写? ...

  6. eclipse显示代码行数

    最近做的手机APP正在进行最后一部分了,在一个类中估计要写上千行代码,来回的拉动滚动条太麻烦了,于是发现为什么我得eclipse不显示代码行数呢  其他C什么的编译器都显示的. 于是百度了一下,一下子 ...

  7. system.transfer.list版本进化

    从android5.0开始之后,recovery升级包中不再升级system.img,而是升级system.new.dat+system.transfer.list的这种文件组合,经过android版 ...

  8. 利用Spring的AbstractRoutingDataSource解决多数据源的问题

    多数据源问题很常见,例如读写分离数据库配置. 原来的项目出现了新需求,局方要求新增某服务器用以提供某代码,涉及到多数据源的问题. 解决方法如下: 1.首先配置多个datasource <bean ...

  9. JS代码段:VUE下的时间,星期和年月日

    不为别的,只为以后复制粘贴方便 data() { return { date: "", time: "", week: "" }; }, / ...

  10. C#语言————第四章 常用Convert类的类型转换方法

    方法 说明Convert.ToInt32() 转换为整型(int 型)Convert.ToStringle() 转换为单精度浮点型(float 型)Convert.ToDouble()  转换为双精度 ...