[lxc-devel] fixing restoring of tty mode after lxc-start
Michael Tokarev
mjt at tls.msk.ru
Sat Nov 21 09:27:57 UTC 2009
Michel Normand wrote:
> Michael Tokarev a e'crit :
>> Hello.
>>
>> While trying to fix the tty mode after lxc-start, I come across
>> lxc_close_all_inherited_fd() routine. Which closes all fds which
>> were inherited when lxc-start started.
>>
>> It's called this way:
>>
>> lxc_start.c:main():
>> lxc_start():
>> lxc_spawn();
>> lxc_close_all_inherited_fd()
>> lxc_poll()
>>
>> The question is why lxc_close_all_inherited() is needed here.
>> And why it is ever needed _outside_ of the container to start
>> with.
>>
>> This call to close_all_inherited_fd() is the reason why tty
>> modes are not restored after lxc-start: because stdin is now
>> closed and hence nothing to restore.
>>
>> It looks like the whole inherited_fd thing is only needed in
>> lxc_init helper binary,
>
> In fact the lxc_close_all_inherited_fd function was defined
> to cover the case of a user appli creating pipes before to fork
> the lxc-start, and to use these pipes to communicate with the appli
> started inside the container.
There's no need to close these pipes in lxc_start itself. For that,
it is enough to close them in the child of lxc_start, the one which
becomes container's init process. Which is exactly what I'm talking
about here.
> For that purpose it was required for lxc to not keep a reference
> on these fds while lxc code is waiting for the appli to run up to its end.
> This is the reason why this function is called in two places
> in lxc_init.c and start.c
Note that lxc_init, like lxc_start's child, runs inside the container.
Thanks!
/mjt
More information about the lxc-devel
mailing list