This is the mail archive of the cygwin@cygwin.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

RE: Strange fork() behaviour under cygwin v1.3.1


> -----Original Message-----
> From: Andrew de Quincey [mailto:andrew@orbital.co.uk]
> Sent: Tuesday, May 22, 2001 9:01 AM
> To: cygwin@cygwin.com
> Subject: Strange fork() behaviour under cygwin v1.3.1
> 
> 
> 
> Hi, I've been playing with the jabber server under win32... 
> and I've run
> into a slight problem. The following program illustrates it:
> 
> +++++++++++++++++++++++++++++++++++++++++++++++++
> #include <pth.h>

Whats <pth.h> ? If it's the GNU portable threads library, and it's using
a native thread library instead of 100% emulated threads, make sure its
using pthreads, not win32 threads. (Explanation: Cygwin is ignorant of
direct win32 thread calls you might make, but it knows about pthreads).

> #include <stdio.h>
> 
> void *test(void *arg);
> 
> int main(int argc, char* argv[]) {
>   int pid;
>   pth_init();
> 
>   pth_join(pth_spawn(PTH_ATTR_DEFAULT, test, NULL), NULL);
> }
> 
> void *test(void *arg) {
>   int pid;
> 
>   pid = fork();
>   if (pid < 0) {
>     printf("FORKFAILED\n");
>   } else if (pid == 0) {
>     printf("FORKCHILD\n");
>   } else {
>     printf("FORKPARENT\n");
>   }
> }

****** IMPORTANT *******
When writing or testing threading code, ___always___ check return values
and error flags.

I realise that that isn't the problem here: your thread function does
run, but all the same!
************************

> +++++++++++++++++++++++++++++++++++++++++++++++++
> 
> This outputs the following when run:
>       0 [main] a 1760 sync_with_child: child 1524(0x23C) died before
> initialization with status code 0x1
>    2496 [main] a 1760 sync_with_child: *** child state 
> waiting for longjmp
> FORKFAILED
> 
> 
> Is this a known problem, not being able to fork() once you 
> are inside a
> spawned thread? Or, is this a bug I have run across...?

I strongly suspect the pth library is using native win32 threads, not
pthreads.
I'm using cygwin 1.3.2, but I don't recall any fork() fixes in the
update.

my test program output:

$ ./ptfork.exe
FORKPARENT
FORKCHILD

and the program:
====
$ cat ptfork.c
#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <sys/errno.h>

void *test(void *arg);

int main(int argc, char* argv[]) {
  int err;
  pthread_t thread;
  void * threadrv;

  if ((err = pthread_create(&thread, NULL, test, NULL))) {
    printf("Error on pthread_create %d:%s\n",err,strerror(err));
    exit(1);
  }

  if ((err = pthread_join(thread, &threadrv))) {
    printf("Error on pthread_join %d:%s\n",err,strerror(err));
    exit(1);
  }

}

void *test(void *arg) {
  int pid;

  pid = fork();
  if (pid < 0) {
    printf("FORKFAILED\n");
  } else if (pid == 0) {
    printf("FORKCHILD\n");
  } else {
    printf("FORKPARENT\n");
  }
}

Rob
 
> BTW: I'm using cygwin dll 1.3.1, pth 1.4.0, and win2k SP1
> 
> 
> 
> --
> Want to unsubscribe from this list?
> Check out: http://cygwin.com/ml/#unsubscribe-simple
> 
> 

--
Want to unsubscribe from this list?
Check out: http://cygwin.com/ml/#unsubscribe-simple


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]