Never queue an ignored signal

This commit is contained in:
Ruihan Li
2025-05-12 11:22:47 +08:00
committed by Jianfeng Jiang
parent 3e32a38316
commit 0661a0656b
7 changed files with 164 additions and 31 deletions

View File

@ -0,0 +1,80 @@
// SPDX-License-Identifier: MPL-2.0
#include "../network/test.h"
#include <unistd.h>
#include <signal.h>
static volatile int received_signals;
static void signal_handler(int signum)
{
++received_signals;
}
static sigset_t sigs;
FN_SETUP(sigs)
{
CHECK(sigemptyset(&sigs));
CHECK(sigaddset(&sigs, SIGCHLD));
}
END_SETUP()
FN_TEST(kill_blocked_and_ignored)
{
signal(SIGCHLD, SIG_DFL);
received_signals = 0;
TEST_RES(sigprocmask(SIG_BLOCK, &sigs, NULL), received_signals == 0);
received_signals = 0;
TEST_RES(kill(getpid(), SIGCHLD), received_signals == 0);
signal(SIGCHLD, &signal_handler);
// FIXME: Currently, Asterinas never queues an ignored signal, so this test
// will fail. See the comments at `PosixThread::enqueue_signal_locked` for
// more details.
//
// received_signals = 0;
// TEST_RES(sigprocmask(SIG_UNBLOCK, &sigs, NULL), received_signals == 1);
//
sigprocmask(SIG_UNBLOCK, &sigs, NULL);
}
END_TEST()
FN_TEST(kill_blocked_not_ignored)
{
signal(SIGCHLD, SIG_DFL);
received_signals = 0;
TEST_RES(sigprocmask(SIG_BLOCK, &sigs, NULL), received_signals == 0);
signal(SIGCHLD, &signal_handler);
received_signals = 0;
TEST_RES(kill(getpid(), SIGCHLD), received_signals == 0);
received_signals = 0;
TEST_RES(sigprocmask(SIG_UNBLOCK, &sigs, NULL), received_signals == 1);
}
END_TEST()
FN_TEST(change_blocked_to_ignored)
{
signal(SIGCHLD, &signal_handler);
received_signals = 0;
TEST_RES(sigprocmask(SIG_BLOCK, &sigs, NULL), received_signals == 0);
received_signals = 0;
TEST_RES(kill(getpid(), SIGCHLD), received_signals == 0);
signal(SIGCHLD, SIG_IGN);
signal(SIGCHLD, &signal_handler);
received_signals = 0;
TEST_RES(sigprocmask(SIG_UNBLOCK, &sigs, NULL), received_signals == 0);
}
END_TEST()