Linux下Python与C程序进程间通信

这几天做了一点事情,略微有些收获,跟大家分享一下

Python大家应该比较熟悉,很好的一门语言,最近几年一直很流行,尤其是在外企,比较有名的IT公司几乎毫无例外的都使用python,像Intel, Marvell, Cisco, EMC等等。

我也认为这门语言很优秀,首先是语法简单,学起来很快,如果有c++经验的话几天就上手了,

其次是开源,那就意味着你可以再遵循GPL的条件下随意分发和使用。

还有就是维护起来容易,据统计Python代码比其他代码维护成本至少要少一半

好了,不说废话了,记得有次参加Ubuntu的发布会,有位大牛说过一句话“人生苦短,请用Python”


但是一些比较底层的东西Python是无能为力的,比如说Linux下的文件系统啊,设备驱动啊等等,跟C比起来效率还是差一截,毕竟这个世上没有万能的工具,

但是我们可以将这几个工具组合以发挥他们最大的威力,靠近底层的,效率要求比较高的我们用c来实现,c短小精悍,而上层点的比如UI部分我们则可以用Python来实现,

然后用Python来调用c程序,好了,这里就是本文的关键了,怎么让C程序和Python通信呢?


可能上面讲的很多人还不是很明白,上个例子吧

比如我们要操作磁盘设备文件(/dev/sdb1),然后对这个文件进行写,直到将其写满位置,一般这种文件都很大,如果用python来做的话效率势必很低,我们

只有用c来实现,具体的c程序的实现部分比较简单,感兴趣的可以自己做个实验,上层UI部分我们用Python实现。


现在假设我们已经用C程序实现了,并编译生成一个可执行文件,名为“DiskErase”,

我们需要实现的是DiskErase怎么和Python程序通信,以让UI知道当前写了多少字节到/dev/sdb1中,然后更新当前进度条。

在Python中我们很容易通过System("./DiskErase")来实现对DiskErase的调用,但是这样是不能让上层Pthon程序和DiskErase通信的,

有人说Python中有个popen(“./DiskErase"),然后就可以通信了, 不错,这样只能Python程序是可以得到DsikErase的输出(printf之类的东西),

但是Python会等待DiskErase执行完毕才会再继续执行下去,那么我们UI中的进度条怎么可能实时更新了,所以这种方法当然不行。

Python中还有个专门用于进程间通信的模块,名叫subprocess,可以在python程序中将标准输出作为管道,这里的DiskErase输出到标准输出的东西我们都可以通过

读管道来获得,所以可以实时获得DiskErase的输出,更新UI部分的精度条,这样就实现了C程序和Python的进程间通信,下面是Python程序的部分关键源码:




## This funciton is to excute the cmd in order to fork a new process by subprocess.Popen ###
def excute_cmd(self, cmd = []):                                            //cmd = ['xad_hd', '-s', str(standard), '-g', self.get_disk(widget)]    cmd 是一个列表,可以以参数传递过去

percentage = 0                                                                 // 列表第一项是C程序的可执行文件,后面的是一些参数

sp = subprocess.Popen(cmd, stdout = subprocess.PIPE, stderr = subprocess.PIPE)   //将标准输出和标准错位重定向为管道
    while True:
        time.sleep(0.5) 
        sp.send_signal(signal.SIGUSR1)            //每0.5秒python程序向c程序发送一次信号, c程序对应的信号处理程序中向标准输出打印想要传递的数据

message = sp.stdout.readline()            //读管道

.........                                             //对从管道读到的数据进行处理
    

阅读(1616) | 评论(0) | 转发(0) |
0

上一篇:real time performance test

下一篇:Linux下从信号量看线程调度时间

相关热门文章
  • automake,autoconf使用详解...
  • linux性能与调优指南 1.1 linu...
  • 应当作为收益性支出
  • SOA中的远程调用框架和Zookeep...
  • 海事担保的程序
  • linux 常见服务端口
  • 【ROOTFS搭建】busybox的httpd...
  • 什么是shell
  • linux socket的bug??
  • linux的线程是否受到了保护?...
  • socket编程开启混杂模式的目的...
  • C++ 嵌套类是干什么的?...
  • C++ 单例怎么写?
  • sizeof 这个操作符都有什么特...
  • Oracle VM server 如何删除vm ...
给主人留下些什么吧!~~
评论热议

你可能感兴趣的:(LINUX)