An invocation of raise(SIGABRT), that is, of a synchronous signal, produces
random behaviour in Cygwin 3.5.5: Sometimes it succeeds, sometimes it fails
with error ENOSYS. In previous releases of Cygwin and in all other operating
systems, it always succeeds.
How to reproduce:
Find test-sigaction.c attached.
Compile it and run it 10 times:
$ x86_64-pc-cygwin-gcc -O2 -Wall test-sigaction.c \
&& ./a && ./a && ./a && ./a && ./a && ./a && ./a && ./a && ./a && ./a
ret = -1, errno = 88
ret = -1, errno = 88
ret = 0, errno = 0
ret = -1, errno = 88
ret = -1, errno = 88
ret = -1, errno = 88
ret = -1, errno = 88
ret = -1, errno = 88
ret = -1, errno = 88
ret = 0, errno = 0
This unit test is part of Gnulib. Really, it is a pity that none of the
Cygwin maintainers is running the Gnulib tests before making a new Cygwin
release.
Bruno
#include <signal.h>
#include <errno.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
int volatile test_exit_status = EXIT_SUCCESS;
#define ASSERT(expr) \
do \
{ \
if (!(expr)) \
{ \
fprintf (stderr, "%s:%d: assertion '%s' failed\n", \
__FILE__, __LINE__, #expr); \
fflush (stderr); \
if (1) \
{ \
test_exit_status = EXIT_FAILURE; \
} \
else \
abort (); \
} \
} \
while (0)
static void
handler (int sig)
{
}
int
main (void)
{
struct sigaction sa;
sa.sa_handler = handler;
sa.sa_flags = 0;
ASSERT (sigemptyset (&sa.sa_mask) == 0);
ASSERT (sigaction (SIGABRT, &sa, NULL) == 0);
int ret = raise (SIGABRT);
//fprintf (stderr, "ret = %d\n", ret); fflush(stderr);
fprintf (stderr, "ret = %d, errno = %d\n", ret, errno); fflush(stderr);
//ASSERT (ret == 0);
return test_exit_status;
}
--
Problem reports: https://cygwin.com/problems.html
FAQ: https://cygwin.com/faq/
Documentation: https://cygwin.com/docs.html
Unsubscribe info: https://cygwin.com/ml/#unsubscribe-simple