[PATCH v3 2/9] syscalls: Add epoll_wait08
Cyril Hrubis <[email protected]>
| Newsgroups | gmane.linux.ltp |
|---|---|
| Message-ID | <[email protected]> |
Tests that epoll_wait() can be interrupted by a signal and returns EINTR. Signed-off-by: Cyril Hrubis <[email protected]> Reviewed-by: Andrea Cervesato <andrea.cervesato-IBi9RG/[email protected]> --- runtest/syscalls | 3 + .../kernel/syscalls/epoll_wait/.gitignore | 1 + .../kernel/syscalls/epoll_wait/epoll_wait08.c | 69 +++++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 testcases/kernel/syscalls/epoll_wait/epoll_wait08.c diff --git a/runtest/syscalls b/runtest/syscalls index 65bac761b..debe64ff9 100644 --- a/runtest/syscalls +++ b/runtest/syscalls @@ -187,6 +187,7 @@ epoll_ctl02 epoll_ctl02 epoll_ctl03 epoll_ctl03 epoll_ctl04 epoll_ctl04 epoll_ctl05 epoll_ctl05 + epoll_wait01 epoll_wait01 epoll_wait02 epoll_wait02 epoll_wait03 epoll_wait03 @@ -194,6 +195,8 @@ epoll_wait04 epoll_wait04 epoll_wait05 epoll_wait05 epoll_wait06 epoll_wait06 epoll_wait07 epoll_wait07 +epoll_wait08 epoll_wait08 + epoll_pwait01 epoll_pwait01 epoll_pwait02 epoll_pwait02 epoll_pwait03 epoll_pwait03 diff --git a/testcases/kernel/syscalls/epoll_wait/.gitignore b/testcases/kernel/syscalls/epoll_wait/.gitignore index 66ac18ae2..f3b208950 100644 --- a/testcases/kernel/syscalls/epoll_wait/.gitignore +++ b/testcases/kernel/syscalls/epoll_wait/.gitignore @@ -5,3 +5,4 @@ epoll_wait04 epoll_wait05 epoll_wait06 epoll_wait07 +epoll_wait08 diff --git a/testcases/kernel/syscalls/epoll_wait/epoll_wait08.c b/testcases/kernel/syscalls/epoll_wait/epoll_wait08.c new file mode 100644 index 000000000..9e9a88526 --- /dev/null +++ b/testcases/kernel/syscalls/epoll_wait/epoll_wait08.c @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) 2026 Cyril Hrubis <[email protected]> + */ + +/*\ + * Verify that :manpage:epoll_wait() fails with EINTR when a signal arrives + * while waiting for events. + * + * [Algorithm] + * + * - Create an epoll instance + * - Fork a child that waits in the :manpage:epoll_wait(), parents sends + * SIGUSR1 to interrupt it. + * - Verify that :manpage:epoll_wait() returns -1 with errno set to EINTR. + */ + +#include <stdlib.h> +#include <sys/epoll.h> + +#include "tst_test.h" +#include "tst_epoll.h" + +static int efd = -1; + +static void sighandler(int sig LTP_ATTRIBUTE_UNUSED) +{ +} + +static void setup(void) +{ + static struct sigaction sa = { + .sa_handler = sighandler, + }; + + SAFE_SIGEMPTYSET(&sa.sa_mask); + SAFE_SIGACTION(SIGUSR1, &sa, NULL); + + efd = SAFE_EPOLL_CREATE1(0); +} + +static void run(void) +{ + pid_t pid = SAFE_FORK(); + + if (!pid) { + struct epoll_event ev; + + TST_EXP_FAIL(epoll_wait(efd, &ev, 1, -1), EINTR, + "epoll_wait() interrupted by signal"); + exit(0); + } + + TST_PROCESS_STATE_WAIT(pid, 'S', 0); + SAFE_KILL(pid, SIGUSR1); +} + +static void cleanup(void) +{ + if (efd != -1) + SAFE_CLOSE(efd); +} + +static struct tst_test test = { + .test_all = run, + .setup = setup, + .cleanup = cleanup, + .forks_child = 1, +}; -- 2.53.0 -- Mailing list info: https://lists.linux.it/listinfo/ltp