我们在编程过程中,经常会遇到这样的需求,点击一下按钮,启动另外一个应用程序,或者执行一个脚本。你一定觉得这个多简单啊,有什么可写的?其实实现同一个功能,不同的开发人员写出的代码可能千差万别,执行效率,容错率,是否有唯一启动保护等……当然,我们还是需要通过衡量具体的需求和环境来设计自己的代码,量体裁衣。
最简单的,我们可以通过system直接启动一个应用程序或者脚本:
system("./helloworld"); system("./hello.sh");
操作简单,但是我们可以很清晰的看到弊端:虽然很顺利的匹出一个进程去执行另外一个应用,但是我们拿不到这个新进程的任何东西,也就失去了对这个进程的控制权。所以我们可以尝试利用QProcess:
void Widget::startApps(QString str) { QProcess *proc = new QProcess(); proc->start(str); }
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 &");
如果你需要必须保证启动一个新的helloworld,那么依旧有好办法,先杀掉可能存在的helloworld,然后再启动,无声无息:
system("killall helloworld");如果不确定应用名字就是helloworld,我们只需要把命令替换成:
ps aux | grep helloworld | grep -v grep |awk '{print $2}' | xargs kill 2&> /dev/null
待续……