Add kill() support - sort of

Operating Systems / OSv - Nadav Har'El [cloudius-systems.com] - 29 September 2013 04:37 UTC

This patch adds support for the Linux kill(2) function. The next patch will add alarm(2) support, which uses kill(2).

To be honest, we sort-of implement kill(). This implementation is compatible with the API, but the semantics are somewhat different: While in Linux kill() causes the signal handler to run on one of the existing threads, in this implementation, the signal handler is run in a
*new* thread.

Implementing the exact Linux semantics in OSv would require tracking when OSv runs kernel code (i.e., code in the main executable, not a shared object) so we can delay running the signal handler until returning to the user code. Moreover, we'll need to be able to interrupt sleeping kernel code. This is complicated and adds overhead even if signals aren't used (and they aren't used in most modern code).

I expect that this code will be "good enough" in many use cases. This code will *not* be good in enough in programs that expect one of the following:

1. A program that by using Posix Thread's "signal masks" tried to ensure that the signal is delivered to one specific thread, and not to an arbitrary thread.

2. A program that used kill() or alarm() not intending to run a signal handler, but rather intending to interrupt a sleeping system call like sleep() or read(). Our kill() does not interrupt sleeping OSv function calls, which will continue to sleep on the thread they run on.

The support in this patch (and see next patch, for alarm()) is good enough for netperf's use of alarm().

P.S. kill() can be used only to send a signal to the current process, the only process we have in OSv (you can also use pid=0 and pid=-1 to achieve the same results).

This patch also adds a test for kill() and alarm(). The alarm() test will fail until the next patch :-)

b9ed15c Add kill() support - sort of
bootfs.manifest | 1 +
build.mk | 1 +
libc/signal.cc | 70 +++++++++++++++++++++++++++++++++++++++++++++
tests/tst-kill.cc | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 153 insertions(+)

Upstream: github.com


  • Share