作为一项规则,curses 不是线程安全的。如果您在一个线程中完成所有工作,您可以使 curses 应用程序工作。否则,你会得到意想不到的行为......
ncurses 有一个编译时配置,它提供基本支持(即,更好的起点),但您不太可能以预打包的形式遇到它,尽管它是几年前引入的(参见常见问题解答官方版本)。
进一步阅读:
在初始化期间,ncurses 为SIGWINCH
其他一些添加信号处理程序。使用strace
,我可以看到 python 正在捕获SIGWINCH
并忽略它:
2722 <... futex resumed> ) = ? ERESTARTSYS (To be restarted if SA_RESTART is set)
2722 --- SIGWINCH {si_signo=SIGWINCH, si_code=SI_KERNEL} ---
2722 rt_sigreturn({mask=[]}) = -1 EINTR (Interrupted system call)
2722 futex(0x7f94d4000c10, FUTEX_WAIT_PRIVATE, 0, NULL) = ? ERESTARTSYS (To be restarted if SA_RESTART is set)
2722 --- SIGWINCH {si_signo=SIGWINCH, si_code=SI_KERNEL} ---
2722 rt_sigreturn({mask=[]}) = -1 EINTR (Interrupted system call)
2722 futex(0x7f94d4000c10, FUTEX_WAIT_PRIVATE, 0, NULL) = ? ERESTARTSYS (To be restarted if SA_RESTART is set)
2722 --- SIGINT {si_signo=SIGINT, si_code=SI_KERNEL} ---
2722 rt_sigreturn({mask=[]}) = -1 EINTR (Interrupted system call)
2722 write(2, "Exception ignored in: <module 'threading' from '/usr/lib/python3.4/threading.py'>\n", 82) = 82
2722 write(2, "Traceback (most recent call last):\n", 35) = 35
2722 write(2, " File \"/usr/lib/python3.4/threading.py\", line 1285, in _shutdown\n", 66) = 66
2722 open("/usr/lib/python3.4/threading.py", O_RDONLY|O_CLOEXEC) = 4
因为python已经建立了一个信号处理程序,ncurses不能再看到SIGWINCH
,并且不会传递KEY_RESIZE
. 大概这是在 python 中完成的,以减轻线程配置中的信号问题。
也许相关信息: