2009年 06月 12日 的归档
给python增加IPC模块
前天介绍了linux进程间通信──消息队列,由于消息队列是linux内核提供的功能,所以理所当然地,C语言用起来最为方便:直接include一个sys/msg.h就可以了,所以之前的文章,我也是用C语言来做演示的.
那么我喜欢的Python能不能用IPC呢?能不能像C一样用消息队列呢?
其实,Python的内置模块里,并没有对IPC的支持,但是好在python的可扩展性超强,我们可以用swig来为python增加一个IPC模块.方法如下:
下载这个tar包(修改自这里),解压到任意目录,得到 ipc.h  ipc.i  Makefile 3个文件,如果你不是用的python2.6,需要修改一下 Makefile 里的路径(python3系列未测试).然后 
| 
					 1  | 
						make && make install   | 
					
这样,你就可以在python里 import ipc模块了.
还是贴示例代码,保存为ipc_msg.py,并加可执行权限:
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42  | 
						#!/usr/bin/env python import sys,ipc if len(sys.argv)==5 and sys.argv[3][0]=='s':     ipc_key=int(sys.argv[1])     msg_id = ipc.msgget(ipc_key,0666|ipc.IPC_CREAT)     if 0 > msg_id:         sys.exit(1)     mbuf = ipc.msgbuf()     mbuf.mtype = int(sys.argv[2])     mbuf.mtext = sys.argv[4]     if 0 > ipc.msgsnd(msg_id,mbuf,len(mbuf.mtext),0):         sys.exit(3)     print 'Send Success.' elif len(sys.argv)==4 and sys.argv[3][0]=='r':     ipc_key=int(sys.argv[1])     mbuf = ipc.msgbuf()     msg_id = ipc.msgget(ipc_key,0666)     if 0 > msg_id:         sys.exit(1)     msg_len=ipc.msgrcv(msg_id,mbuf,2048,int(sys.argv[2]),ipc.IPC_NOWAIT)     if 0 > msg_len:         print 'No message received.'         sys.exit(3)     else:         print 'Recv Success.(%d bytes):'% msg_len         print mbuf.mtext elif len(sys.argv)==3 and sys.argv[2][0]=='c':     ipc_key=int(sys.argv[1])     id_dsp = ipc.msqid_ds()     msg_id = ipc.msgget(ipc_key,0666)     if 0 > msg_id:         sys.exit(1)     if 0 > ipc.msgctl(msg_id,ipc.IPC_RMID,id_dsp):         sys.exit(2) else:     print "usage: \n%s key type s message --to send message\n\ %s key type r --to receive\n\ %s key c --to clear queue"\         %(sys.argv[0],sys.argv[0],sys.argv[0])  | 
					
运行结果:
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29  | 
						lily@LLY:~/test/ipc$ ipcs -q ------ Message Queues -------- key        msqid      owner      perms      used-bytes   messages     lily@LLY:~/test/ipc$ ./ipc_msg.py 1 2 s abc Send Success. lily@LLY:~/test/ipc$ ipcs -q ------ Message Queues -------- key        msqid      owner      perms      used-bytes   messages     0x00000001 65536      lily       666        3            1            lily@LLY:~/test/ipc$ ./ipc_msg.py 1 2 r Recv Success.(3 bytes): abc lily@LLY:~/test/ipc$ ipcs -q ------ Message Queues -------- key        msqid      owner      perms      used-bytes   messages     0x00000001 65536      lily       666        0            0            lily@LLY:~/test/ipc$ ./ipc_msg.py 1 c lily@LLY:~/test/ipc$ ipcs -q ------ Message Queues -------- key        msqid      owner      perms      used-bytes   messages     lily@LLY:~/test/ipc$  | 
					
怎么样?和之前的C语言版本一模一样吧?
gentoo的内核升级到2.6.30 fglrx加载失败
昨天sync,发现有 sys-kernel/gentoo-sources-2.6.30 可用了,我没忍住,就升级上去了,其他的倒是没啥感觉,就是加载不了fglrx了…
虽然ati-drivers在我修改了一下ebuild以后,已经成功安装上去了,fglrx.ko也生成了,但是却加载不了,导致compiz不能用了.
modprobe fglrx的时候,提示:
FATAL: Error inserting fglrx (/lib/modules/2.6.30-gentoo-lly/video/fglrx.ko): Unknown symbol in module, or unknown parameter (see dmesg)
然后,dmesg里有这样两行:
fglrx: Unknown symbol flush_tlb_page
fglrx: Unknown symbol pci_enable_msi
应该是内核做了该动了.不知道有没有针对2.6.30的patch…不然,难道我要去用开源驱动了?
PS: 今天又发现了 sys-kernel/gentoo-sources-2.6.30-r1 orz…