免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3734 | 回复: 6
打印 上一主题 下一主题

请教一个fork的郁闷问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-18 18:53 |只看该作者 |倒序浏览
我有如下的python程序,具体程序如下:

  1. #!/usr/bin/python

  2. import pygtk
  3. pygtk.require('2.0')
  4. import gtk
  5. import os
  6. import sys
  7. import string
  8. import time

  9. class Test(gtk.Window):
  10.     def destroy(self, widget, data=None):
  11.         gtk.main_quit()

  12.     def btn_event(self, widget, data=None):
  13.         pid = os.fork()
  14.         if not pid:
  15.              time.sleep(0.1)
  16.              os.system("ls")
  17.         else:
  18.              pass

  19.     def __init__(self):
  20.         window = gtk.Window(gtk.WINDOW_TOPLEVEL)
  21.         window.connect("destroy", self.destroy)
  22.         window.set_position(gtk.WIN_POS_CENTER_ALWAYS)
  23.         hbox = gtk.HBox(False, 0)
  24.         btnOK = gtk.Button("OK")
  25.         hbox.pack_start(btnOK, False, True, 24)
  26.         btnCancel = gtk.Button("Cancel")
  27.         hbox.pack_start(btnCancel, False, True, 24)
  28.         btnOK.connect("clicked", self.btn_event)
  29.         btnCancel.connect("clicked", self.destroy)
  30.         window.add(hbox)
  31.         window.show_all()

  32.     def main(self):
  33.         gtk.main()

  34. if __name__ == "__main__":
  35.     test = Test()
  36.     test.main()
复制代码


只点击ok按扭,就会出现如下错误:
python: xcb_io.c:242: process_responses: Assertion `(((long) (dpy->last_request_read) - (long) (dpy->request)) <= 0)' failed.
Aborted
python: xcb_io.c:242: process_responses: Assertion `(((long) (dpy->last_request_read) - (long) (dpy->request)) <= 0)' failed.

我试来试去,都没有找到具体原因。现在我估错误应该是出在fork那段。请问,这应该怎么改才不会出现这个郁闷的问题呢?

论坛徽章:
0
2 [报告]
发表于 2009-05-19 11:16 |只看该作者
没有人遇到过这种情况么?

论坛徽章:
0
3 [报告]
发表于 2009-05-25 09:29 |只看该作者
一直没有人回应啊。。。

论坛徽章:
0
4 [报告]
发表于 2009-05-26 09:04 |只看该作者
呵,有时间去邮件组发下。偶没研究过界面

论坛徽章:
0
5 [报告]
发表于 2010-02-21 16:40 |只看该作者
我用C写的fork时候也有问题,跟你一模一样的错误啊。。。。。
找到解决办法了吗???

论坛徽章:
0
6 [报告]
发表于 2010-02-21 21:40 |只看该作者
应该使用 exec 一族的函数替换当前进程,不应该用 os.system。

论坛徽章:
0
7 [报告]
发表于 2010-02-23 17:45 |只看该作者
python: xcb_io.c:242: process_responses: Assertion `(((long) (dpy->last_request_read) - (long) (dpy->request)) <= 0)' failed.
Aborted
python: xcb_io.c:242: process_responses: Assertion `(((long) (dpy->last_request_read) - (long) (dpy->request)) <= 0)' failed.

看起来有点类似“锁”方面的问题,我在写多线程的GUI程序时也遇到过这种问题,如果一个后台线程要访问GTK主线程(即GUI界面上的元素)时,需要使用gtk.threads_enter() 和gtk.threads_leave()函数。你这里fork之后,出现了两个GTK主循环,这肯定是有问题的。不知道为什么这样写?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP