gvisor/runsc/container
Nicolas Lacasse f1c01ed886 runsc: Support job control signals in "exec -it".
Terminal support in runsc relies on host tty file descriptors that are imported
into the sandbox. Application tty ioctls are sent directly to the host fd.

However, those host tty ioctls are associated in the host kernel with a host
process (in this case runsc), and the host kernel intercepts job control
characters like ^C and send signals to the host process. Thus, typing ^C into a
"runsc exec" shell will send a SIGINT to the runsc process.

This change makes "runsc exec" handle all signals, and forward them into the
sandbox via the "ContainerSignal" urpc method. Since the "runsc exec" is
associated with a particular container process in the sandbox, the signal must
be associated with the same container process.

One big difficulty is that the signal should not necessarily be sent to the
sandbox process started by "exec", but instead must be sent to the foreground
process group for the tty. For example, we may exec "bash", and from bash call
"sleep 100". A ^C at this point should SIGINT sleep, not bash.

To handle this, tty files inside the sandbox must keep track of their
foreground process group, which is set/get via ioctls. When an incoming
ContainerSignal urpc comes in, we look up the foreground process group via the
tty file. Unfortunately, this means we have to expose and cache the tty file in
the Loader.

Note that "runsc exec" now handles signals properly, but "runs run" does not.
That will come in a later CL, as this one is complex enough already.

Example:
	root@:/usr/local/apache2# sleep 100
	^C

	root@:/usr/local/apache2# sleep 100
	^Z
	[1]+  Stopped                 sleep 100

	root@:/usr/local/apache2# fg
	sleep 100
	^C

	root@:/usr/local/apache2#

PiperOrigin-RevId: 215334554
Change-Id: I53cdce39653027908510a5ba8d08c49f9cf24f39
2018-10-01 22:06:56 -07:00
..
BUILD runsc: Support job control signals in "exec -it". 2018-10-01 22:06:56 -07:00
container.go runsc: Support job control signals in "exec -it". 2018-10-01 22:06:56 -07:00
container_test.go runsc: Support job control signals in "exec -it". 2018-10-01 22:06:56 -07:00
fs.go Don't fail if Root is readonly and is not a mount point 2018-09-30 23:23:03 -07:00
fs_test.go Put fsgofer inside chroot 2018-08-27 11:10:14 -07:00
hook.go
multi_container_test.go runsc: Support job control signals in "exec -it". 2018-10-01 22:06:56 -07:00
status.go Added code for a pause command for a container process. 2018-06-15 16:09:09 -07:00
test_app.go Make runsc kill and delete more conformant to the "spec" 2018-09-28 12:22:21 -07:00