原创文章,转载请注明出处,谢谢!
作者:清林,博客名:飞空静渡
前言: 我们在写程序时,有时会需要调用到外部的一些程序,因此在linux下,我们会fork(windows下是CreateProcess)一个子进程,然后exec这个子进程,然后在父进程中等待子进程结束并获得子进程的退出码。进一步,如果我们想拦截子进程的输出,并把子进程的输出保存下来,或是处理信号等等时,就得另外再处理这些情况。但有没有其它一些库或程序可以帮我们做好这些吃力不讨好的事呢,这是有的,下面我将介绍两种方法,一个是gtk下的,一个是kde下的。
第一:在gtk下的需要需要安装glimm,glib和sigc库。下面给出一个函数,看下怎么使用。
这里的关键就是调用Glib::spawn_command_line_sync()这个函数,而这个函数是在glibmm中定义的。其中glib::ustring你可以用std::string来代替,这个没什么关系。output是用来接收子进程的输出,error用来接收子进程的错误输出信息,command就是你要执行的命令,例如“ls -l"之类的。
假如你想偷懒,又可以很好的执行你想执行的子进程,那么你就可以直接使用上面的这个函数,其条件是你必须链接面给出的三个库: -lglibmm-2.4 -lglib-2.0 -lsigc-2.0 并且要包含下面这几个头文件路径:/usr/lib/glibmm-2.4/include /usr/include/glibmm-2.4 /usr/include/glib-2.0 /usr/lib/glib-2.0/include /usr/include/sigc++-2.0 /usr/lib/sigc++-2.0/include
据说glibmm是个跨平台的库,我只在linux使用过这个库,windows下面没试过 :)
第二个就比这个简单得多,其要求就是使用QT库,用QT来执行子进程,当然也是跨平台的啦。下面看下这个QT的类怎么写。
externalcommand.h
其中Q_DISABLE_COPY的作用就是禁止类的拷贝,其做作用相当于:
externalcommand.cpp
这个类怎么使用呢,下面给个例子使用,例如运行“ls -l”命令
cmd.output()就是子进程的输出,想要获得子进程的退出码就应该调用cmd.exitCode()。是不是比自己写fork来得简单肋 :)。
以上这两个库函数的使用真是省心又省力,适合那么在程序设计时经常要调用外部命令的人。
注:以上两个库均来自于linux下的源代码,并略有修改,第一个来自于gparted,第二个来自于partitionmanager。这个两个程序一个是gtk下的分区管理工具,一个是kde下的分区管理工具,但两个的代码的实现方式是差不多的,里面用了许多工厂方法。