delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2004/09/24/03:21:21

Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm
List-Subscribe: <mailto:cygwin-subscribe AT cygwin DOT com>
List-Archive: <http://sourceware.org/ml/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-help AT cygwin DOT com>, <http://sourceware.org/ml/#faqs>
Sender: cygwin-owner AT cygwin DOT com
Mail-Followup-To: cygwin AT cygwin DOT com
Delivered-To: mailing list cygwin AT cygwin DOT com
Message-Id: <200409240720.i8O7Ka2a003068@tyr.informatik.fh-fulda.de>
Date: Fri, 24 Sep 2004 09:20:36 +0200 (CEST)
From: Siegmar Gross <Siegmar DOT Gross AT informatik DOT fh-fulda DOT de>
Reply-To: Siegmar Gross <Siegmar DOT Gross AT informatik DOT fh-fulda DOT de>
Subject: printf output missing in multi-threaded program
To: cygwin AT cygwin DOT com
MIME-Version: 1.0
X-HRZ-JLUG-MailScanner-Information: Passed JLUG virus check
X-HRZ-JLUG-MailScanner: Found to be clean
X-IsSubscribed: yes
Note-from-DJ: This may be spam

Hi,

some of my multi-threaded programs don't print everything they should.
I have for example a small program to show that LinuxThreads don't
behave like real POSIX threads concerning "fork()" (only the thread
which creates a child process can wait for its termination with
LinuxThreads). When I run the program on Solaris I get the following
output:

gorbag work 23 fork_thr                          !!!! Solaris
Thread thr_fork: forking a child process.
Child process: I'm sleeping for 2 seconds.
Thread thr_wait: sleeping for 5 seconds.
Thread thr_fork: sleeping for 10 seconds.
Child process: terminating.
Thread thr_wait: try to wait for child process.
Thread thr_wait: child terminated.
Thread thr_fork: try to wait for my child.       !!!!!! missing in Cygwin
Thread thr_fork: No child processes              !!!!!! missing in Cygwin
gorbag work 24 


When I compile and run the program on Cygwin the last output from
"thr_fork" will not be displayed. I've upgraded Cygwin to the latest
version yesterday. "cygcheck -c" displays that all packages are OK. Cygwin
is installed on Windows XP with all updates excluding SP2.

eiger src 4 fork_thr
Thread thr_fork: forking a child process.        !!!! Cygwin
Thread thr_wait: sleeping for 5 seconds.
Thread thr_fork: sleeping for 10 seconds.
Child process: I'm sleeping for 2 seconds.
Child process: terminating.
Thread thr_wait: try to wait for child process.
Thread thr_wait: child terminated.
eiger src 5 


A search in the mailing list and on the web wasn't successful (lots of
results which weren't related to my problem). I've split the sleeping
time of thr_fork in a loop in one second parts to see when the thread
terminates.

eiger src 11 fork_thr
Thread thr_fork: forking a child process.
Thread thr_wait: sleeping for 5 seconds.
Thread thr_fork: sleeping for 10 seconds.
Child process: I'm sleeping for 2 seconds.
Thread thr_fork: 1 s of sleeping time passed
Thread thr_fork: 2 s of sleeping time passed
Child process: terminating.
Thread thr_fork: 3 s of sleeping time passed
Thread thr_fork: 4 s of sleeping time passed
Thread thr_wait: try to wait for child process.
Thread thr_wait: child terminated.
eiger src 12 

In my opinion it has something to do with the thread implementation in
Cygwin. Does anybody know why thr_fork dies when thr_wait terminates?
Thank you very much for any suggestions in advance.

That's the program without testing "ret".

--- snip ------------------------------------------------------------

/* gcc -o fork_thr fork_thr.c -lpthread					*/

#define _REENTRANT			/* must precede any "#include"!	*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>

void thr_fork (void);
void thr_wait (void);

pid_t fork_pid;				/* ID of child process		*/

int main (void)
{
  int		 ret;			/* return value of a function	*/
  pthread_t	 thr_id [2];  		/* ID's of created threads	*/

  ret = pthread_create (&thr_id [0], NULL,
			(void * (*) (void *)) thr_fork,
			(void *) 0);
  ret = pthread_create (&thr_id [1], NULL,
			(void * (*) (void *)) thr_wait,
			(void *) 1);
  ret = pthread_join (thr_id [0], NULL);
  ret = pthread_join (thr_id [1], NULL);
  return 0;
}


void thr_fork (void)
{
  int i;

  printf ("Thread thr_fork: forking a child process.\n");
  fork_pid = fork ();
  switch (fork_pid)
  {
    case -1:				/* error: no process created	*/
      perror ("fork failed");
      errno = 0;
      break;

    case 0:				/* child process       		*/
      printf ("Child process: I'm sleeping for 2 seconds.\n");
      sleep (2);
      printf ("Child process: terminating.\n");
      exit (0);
      break;

    default:				/* parent process		*/
      printf ("Thread thr_fork: sleeping for 10 seconds.\n");
      for (i = 1; i < 11; i++)
      {
	sleep (1);
	printf ("Thread thr_fork: %d s of sleeping time passed\n", i);
      };
      printf ("Thread thr_fork: try to wait for my child.\n");
      if (waitpid (fork_pid, NULL, WNOHANG) == -1)
      {
	perror ("Thread thr_fork");
	errno = 0;
      }
      else
      {
	printf ("Thread thr_fork: child terminated.\n");
      };
  };
}


void thr_wait (void)
{
  printf ("Thread thr_wait: sleeping for 5 seconds.\n");
  sleep (5);
  printf ("Thread thr_wait: try to wait for child process.\n");
  if (waitpid (fork_pid, NULL, WNOHANG) == -1)
  {
    perror ("Thread thr_wait");
    errno = 0;
  }
  else
  {
    printf ("Thread thr_wait: child terminated.\n");
  };
}


-- snip -------------------------------------------------------------


Kind regards

Siegmar


--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019