mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-22 00:43:24 +00:00
Never queue an ignored signal
This commit is contained in:
committed by
Jianfeng Jiang
parent
3e32a38316
commit
0661a0656b
80
test/apps/signal_c/signal_test2.c
Normal file
80
test/apps/signal_c/signal_test2.c
Normal 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()
|
Reference in New Issue
Block a user