Fix sigsuspend and add it to the sigqueue test.
This commit is contained in:
+25
-7
@@ -24,11 +24,11 @@ void validate(int sig, const siginfo_t *info) {
|
||||
}
|
||||
|
||||
void action(int sig, siginfo_t *info, void *context) {
|
||||
num++;
|
||||
(void)context;
|
||||
assert(context != NULL);
|
||||
validate(sig, info);
|
||||
write(1, "action\n", 7);
|
||||
num++;
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
@@ -40,12 +40,6 @@ int main(void) {
|
||||
parent = getpid();
|
||||
assert(parent != 0);
|
||||
|
||||
int child = fork();
|
||||
ERROR_IF(fork, child, == -1);
|
||||
|
||||
status = close(fds[child == 0 ? 0 : 1]);
|
||||
ERROR_IF(close, status, == -1);
|
||||
|
||||
sigset_t set, mask;
|
||||
status = sigfillset(&mask);
|
||||
ERROR_IF(sigfillset, status, == -1);
|
||||
@@ -67,6 +61,16 @@ int main(void) {
|
||||
status = sigaddset(&set, THE_SIG);
|
||||
ERROR_IF(sigaddset, status, == -1);
|
||||
|
||||
sigset_t empty_set;
|
||||
status = sigemptyset(&empty_set);
|
||||
ERROR_IF(sigemptyset, status, == -1);
|
||||
|
||||
int child = fork();
|
||||
ERROR_IF(fork, child, == -1);
|
||||
|
||||
status = close(fds[child == 0 ? 0 : 1]);
|
||||
ERROR_IF(close, status, == -1);
|
||||
|
||||
struct sigaction sa;
|
||||
memcpy(&sa.sa_mask, &set, sizeof (sigset_t));
|
||||
sa.sa_flags = SA_SIGINFO;
|
||||
@@ -84,6 +88,20 @@ int main(void) {
|
||||
validate(THE_SIG, &info);
|
||||
assert(num == 0); // ensure no signal handler ran
|
||||
|
||||
num++;
|
||||
|
||||
// TODO: check status
|
||||
status = sigsuspend(&empty_set);
|
||||
if (status == -1) {
|
||||
perror("error in sigsuspend");
|
||||
puts("[EINTR] is usually expected");
|
||||
}
|
||||
|
||||
assert(num == 2); // ensure signal handler ran
|
||||
|
||||
status = sigprocmask(SIG_SETMASK, &empty_set, NULL);
|
||||
ERROR_IF(sigprocmask, status, == -1);
|
||||
|
||||
while (num < 31) {}
|
||||
|
||||
status = write(fds[1], "A", 1);
|
||||
|
||||
Reference in New Issue
Block a user