macOS needs SIGTTOU SIGTTIN explicitly ignored to allow the supervisor to use TIOCSWINSZ
This commit is contained in:
parent
be458303c5
commit
4eedf0d36c
@ -48,9 +48,6 @@ def restore_python_signal_handlers() -> None:
|
|||||||
signal.signal(signal.SIGPIPE, signal.SIG_IGN)
|
signal.signal(signal.SIGPIPE, signal.SIG_IGN)
|
||||||
signal.signal(signal.SIGUSR1, signal.SIG_DFL)
|
signal.signal(signal.SIGUSR1, signal.SIG_DFL)
|
||||||
signal.signal(signal.SIGCHLD, signal.SIG_DFL)
|
signal.signal(signal.SIGCHLD, signal.SIG_DFL)
|
||||||
signal.signal(signal.SIGTSTP, signal.SIG_DFL)
|
|
||||||
signal.signal(signal.SIGTTIN, signal.SIG_DFL)
|
|
||||||
signal.signal(signal.SIGTTOU, signal.SIG_DFL)
|
|
||||||
|
|
||||||
|
|
||||||
def print_error(*a: Any) -> None:
|
def print_error(*a: Any) -> None:
|
||||||
@ -397,6 +394,11 @@ def eintr_retry(func: Callable[..., T], *args: Any) -> T:
|
|||||||
return func(*args)
|
return func(*args)
|
||||||
|
|
||||||
|
|
||||||
|
interactive_and_job_control_signals = (
|
||||||
|
signal.SIGINT, signal.SIGQUIT, signal.SIGTSTP, signal.SIGTTIN, signal.SIGTTOU
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def fork_socket_child(child_data: SocketChildData, tty_fd: int, stdio_fds: Dict[str, int], free_non_child_resources: Callable[[], None]) -> int:
|
def fork_socket_child(child_data: SocketChildData, tty_fd: int, stdio_fds: Dict[str, int], free_non_child_resources: Callable[[], None]) -> int:
|
||||||
# see https://www.gnu.org/software/libc/manual/html_node/Launching-Jobs.html
|
# see https://www.gnu.org/software/libc/manual/html_node/Launching-Jobs.html
|
||||||
child_pid = safer_fork()
|
child_pid = safer_fork()
|
||||||
@ -405,6 +407,8 @@ def fork_socket_child(child_data: SocketChildData, tty_fd: int, stdio_fds: Dict[
|
|||||||
# child process
|
# child process
|
||||||
eintr_retry(os.setpgid, 0, 0)
|
eintr_retry(os.setpgid, 0, 0)
|
||||||
eintr_retry(os.tcsetpgrp, tty_fd, eintr_retry(os.getpgid, 0))
|
eintr_retry(os.tcsetpgrp, tty_fd, eintr_retry(os.getpgid, 0))
|
||||||
|
for x in interactive_and_job_control_signals:
|
||||||
|
signal.signal(x, signal.SIG_DFL)
|
||||||
restore_python_signal_handlers()
|
restore_python_signal_handlers()
|
||||||
# the std streams fds are closed in free_non_child_resources()
|
# the std streams fds are closed in free_non_child_resources()
|
||||||
for which in ('stdin', 'stdout', 'stderr'):
|
for which in ('stdin', 'stdout', 'stderr'):
|
||||||
@ -426,10 +430,10 @@ def fork_socket_child_supervisor(conn: socket.socket, free_non_child_resources:
|
|||||||
os.setsid()
|
os.setsid()
|
||||||
restore_python_signal_handlers()
|
restore_python_signal_handlers()
|
||||||
free_non_child_resources()
|
free_non_child_resources()
|
||||||
|
signal_read_fd = install_signal_handlers(signal.SIGCHLD, signal.SIGUSR1)[0]
|
||||||
# See https://www.gnu.org/software/libc/manual/html_node/Initializing-the-Shell.html
|
# See https://www.gnu.org/software/libc/manual/html_node/Initializing-the-Shell.html
|
||||||
signal_read_fd = install_signal_handlers(
|
for x in interactive_and_job_control_signals:
|
||||||
signal.SIGCHLD, signal.SIGUSR1, signal.SIGINT, signal.SIGTSTP, signal.SIGTTIN, signal.SIGTTOU, signal.SIGQUIT
|
signal.signal(x, signal.SIG_IGN)
|
||||||
)[0]
|
|
||||||
poll = select.poll()
|
poll = select.poll()
|
||||||
poll.register(signal_read_fd, select.POLLIN)
|
poll.register(signal_read_fd, select.POLLIN)
|
||||||
from_socket_buf = b''
|
from_socket_buf = b''
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user