Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 21 Nov 1997 12:57:52 -0800 (PST)
From:      Curtis Bray <cbray@best.com>
To:        freebsd-hackers@freebsd.org
Subject:   Re: malloc() problems in children after using rfork()
Message-ID:  <Pine.BSF.3.96.971121125505.26552A-100000@shell5.ba.best.com>

next in thread | raw e-mail | index | archive | help
Curtis Bray wrote:
>   I'm trying to use rfork(RFPROC | RFMEM) so that all the children can
> share the same address space with their parent.
> 
>   If I have multiple children issuing mallocs the children seem to
> core
> dump.  Once I turn the RFMEM flag off I have no problem mallocing (but
> of course I loose the shared address space).  Anyone know what I could
> be doing wrong here?  Do I have to put semaphores around every
> malloc??
> I hope that's not the case...  Thanks in advance!

  By the way, I am running on 2.2.5 (STABLE).

  After further examination I noticed that the segmentation fault only
occurs if the child tries to read or write to the piece of memory that it
allocated.  For example:

void child_proc(int procNum, int time)
{
	char *buf;
	buf = (char *) malloc(255);

	printf("Child %d created...: buf = %p\n", procNum, buf);

	sleep(time); 

	GlobalCount++;

	printf("%c\n", buf[0]);  <<--  It will page fault here...

	printf("Freeing %p\n", buf);
	free(buf);

	exit(0);
}	


  Also if I run with only one child I don't have a problem.  But if two
children try to modify the their malloced space, then only one succeedes
and the other faults.  Here's the output from running the above with 2
children:

---------------
Going to create 2 rfork() process
Parent waiting for children.
Child 0 (PID 8343) created...: buf = 0x15000
Child 1 (PID 8344) created...: buf = 0x15100

Freeing 0x15000
Parent woke up on wait for 8344 with status 139 (#0)
8344 : Signaled? 1 / SigNum 11
Parent woke up on wait for 8343 with status 0 (#1)
8343 : Signaled? 0 / SigNum 0
Parent exiting: Global Count: 2!
---------------

  The same problem occrurs even if I don't call free() in each child.
Other ideas?

  Curtis





Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.3.96.971121125505.26552A-100000>