cli: ignore EINTR caused by SIGWINCH when calling poll()
This can happen when adjusting a tmux pane running mininet cli. The
process will receive SIGWINCH causing the poll() call to raise
select.error
Below is a session dump with strace
09:55:52.498106 poll([{fd=0, events=POLLIN}, {fd=28, events=POLLIN}], 2, -1) = ? ERESTART_RESTARTBLOCK (Interrupted by signal)
09:55:52.606734 --- SIGWINCH {si_signo=SIGWINCH, si_code=SI_KERNEL} ---
09:55:52.606770 rt_sigreturn({mask=[]}) = -1 EINTR (Interrupted system call)
Traceback (most recent call last):
File "examples/topofac.py", line 527, in <module>
run()
File "examples/topofac.py", line 522, in run
CLI( net )
File "/home/yunion/git-repo/mininet/mininet/cli.py", line 68, in __init__
self.run()
File "/home/yunion/git-repo/mininet/mininet/cli.py", line 103, in run
self.cmdloop()
File "/home/yunion/.usr/lib/python2.7/cmd.py", line 142, in cmdloop
stop = self.onecmd(line)
File "/home/yunion/.usr/lib/python2.7/cmd.py", line 220, in onecmd
return self.default(line)
File "/home/yunion/git-repo/mininet/mininet/cli.py", line 422, in default
self.waitForNode( node )
File "/home/yunion/git-repo/mininet/mininet/cli.py", line 440, in waitForNode
bothPoller.poll()
select.error: (4, 'Interrupted system call')
09:55:52.622076 rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x7ff9a9b936d0}, {0x7ff9a9ef2230, [], SA_RESTORER, 0x7ff9a9b936d0}, 8) = 0
09:55:52.631905 +++ exited with 1 +++
This commit is contained in:
@@ -29,6 +29,8 @@ from subprocess import call
|
|||||||
from cmd import Cmd
|
from cmd import Cmd
|
||||||
from os import isatty
|
from os import isatty
|
||||||
from select import poll, POLLIN
|
from select import poll, POLLIN
|
||||||
|
import select
|
||||||
|
import errno
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
import os
|
import os
|
||||||
@@ -459,6 +461,13 @@ class CLI( Cmd ):
|
|||||||
# it's possible to interrupt ourselves after we've
|
# it's possible to interrupt ourselves after we've
|
||||||
# read data but before it has been printed.
|
# read data but before it has been printed.
|
||||||
node.sendInt()
|
node.sendInt()
|
||||||
|
except select.error as e:
|
||||||
|
# pylint: disable=unpacking-non-sequence
|
||||||
|
errno_, errmsg = e.args
|
||||||
|
# pylint: enable=unpacking-non-sequence
|
||||||
|
if errno_ != errno.EINTR:
|
||||||
|
error( "select.error: %d, %s" % (errno_, errmsg) )
|
||||||
|
node.sendInt()
|
||||||
|
|
||||||
def precmd( self, line ):
|
def precmd( self, line ):
|
||||||
"allow for comments in the cli"
|
"allow for comments in the cli"
|
||||||
|
|||||||
Reference in New Issue
Block a user