The recent issue with pthread_atfork handlers reminded me of a scenario
that I know glibc handles, but it seems that Cygwin does not. Test case:
== test.c ==
#include <dlfcn.h>
#include <stdio.h>
#include <sys/wait.h>
#include <unistd.h>
typedef void(*func_type)(void);
int main(void)
{
int wstatus = 0;
func_type func = NULL;
void *handle = dlopen("./testlib.so", RTLD_LAZY);
if (!handle)
{
fprintf(stderr, "dlopen error: %s\n", dlerror());
return 1;
}
func = (func_type)dlsym(handle, "func");
if (!func)
{
fprintf(stderr, "dlsym error: %s\n", dlerror());
return 1;
}
func();
if (dlclose(handle))
{
fprintf(stderr, "dlclose error: %s\n", dlerror());
return 1;
}
switch (fork())
{
case -1:
perror("fork");
return 1;
case 0:
printf("Hi from child!\n");
return 0;
default:
if (wait(&wstatus) == -1)
{
perror("wait");
return 1;
}
printf ("wstatus %d\n", wstatus);
return WIFSIGNALED(wstatus) ? 128 + WTERMSIG(wstatus) :
WEXITSTATUS(wstatus);
}
/* should not get here */
return 123;
}
== testlib.c ==
#include <pthread.h>
#include <stdio.h>
static void prepare(void)
{
printf("in prepare\n");
}
static void parent(void)
{
printf("in parent\n");
}
static void child(void)
{
printf("in child\n");
}
void func(void)
{
int ret;
if (ret = pthread_atfork(prepare, parent, child))
fprintf(stderr, "pthread_atfork returned %d\n", ret);
}
== build commands ==
gcc -fPIC -shared -o testlib.so testlib.c
gcc -o test test.c
./test
== linux output ==
$ ./test
Hi from child!
wstatus 0
== Cygwin 3.6.1 output ==
$ ./test
$ echo $?
0
$ # WTF?
$ gdb ./test
...
(gdb) r
Thread 1 "test" received signal SIGSEGV, Segmentation fault.
0x00000004219b1030 in ?? ()
(gdb) bt
#0 0x00000004219b1030 in ?? ()
#1 0x00000001800ad1b2 in pthread::atforkprepare ()
at ../../.././winsup/cygwin/thread.cc:2091
#2 0x000000018006bdcd in lock_pthread::lock_pthread (this=<synthetic pointer>)
at
/d/a/msys2-runtime/msys2-runtime/winsup/cygwin/local_includes/sigproc.h:136
#3 hold_everything::hold_everything (x=<synthetic pointer>: <optimized out>,
this=<synthetic pointer>)
at
/d/a/msys2-runtime/msys2-runtime/winsup/cygwin/local_includes/sigproc.h:168
#4 dofork (proc=proc@entry=0x0,
with_forkables=with_forkables@entry=0x7ffffcb9f)
at ../../.././winsup/cygwin/fork.cc:640
#5 0x000000018006c239 in fork () at ../../.././winsup/cygwin/fork.cc:590
#6 0x000000018019f564 in _sigfe () at sigfe.s:35
#7 0x000000010040117e in main ()
--
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