两个调用子进程的方法

70 篇文章 1 订阅


       原创文章,转载请注明出处,谢谢!       
       作者:清林,博客名:飞空静渡

 

前言: 我们在写程序时,有时会需要调用到外部的一些程序,因此在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下的分区管理工具,但两个的代码的实现方式是差不多的,里面用了许多工厂方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值