Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 19 Aug 1998 12:16:21 -0400 (EDT)
From:      Luoqi Chen <luoqi@watermarkgroup.com>
To:        bright@www.hotjobs.com, hackers@FreeBSD.ORG
Subject:   Re:  sfork()?
Message-ID:  <199808191616.MAA06764@lor.watermarkgroup.com>

next in thread | raw e-mail | index | archive | help
You need to set up separate stack for the child, this cannot be done
without any assembly. We need a wrapper function for rfork() in libc.
Below is a small test program I wrote a while ago, you may adapt it
to your needs if you want. -lq

#include <sys/syscall.h>
#include <stdio.h>
#include <unistd.h>

void
callfunc(int (*func)(void *), void *arg)
{
	_exit((*func)(arg));
}

int
rforkcall(void *stack, void *func, void *arg)
{
	register int *sp = (int *)stack;
	*--sp = (int)arg;
	*--sp = (int)func;
	*--sp = 0;
	*--sp = (int)callfunc;
	__asm__(
		"pushl %2;\n\t"
		"pushl $0;\n\t"
		"movl %1,%%eax;\n\t"
		".byte 0x9a; .long 0; .word 7;\n\t"
		"cmpl $0, %%edx; je 1f;\n\t"
		"movl %0,%%esp; ret;\n1:\n\t"
		"addl $8,%%esp" :
		: "r" (sp), "g" (SYS_rfork), "g" (RFPROC|RFMEM)
		: "eax", "edx");
}

int n = 0;

int a(char *s)
{
	fprintf(stderr, "%s %d\n", s, n++);
	return 0;
}

char stack1[4096];
char stack2[4096];

main()
{
	rforkcall(stack1+4096, (void *)a, "thread");
	rforkcall(stack2+4096, (void *)a, "thread");
	a("main");
}

> can someone explain why this doesn't work?
> 
> (the child process just segfaults, even without the printfs)
> 
> ----- CUT 
> 
> #include <stdio.h>
> #include <unistd.h>
> 
> volatile int t=0;
> 
> int main(void){
> 
>    pid_t pid;
> 
>    if(pid = rfork(RFPROC | RFMEM)){
>       printf("(parent)pid = %d\n",pid);
>       while(1){
>          printf("%d\n",t);
>          sleep(1);
>       }
>    } else {
>       printf("doesn't die here...");
>       t = 1;
>       printf("changed t... ");
>       sleep(10000);
>    }
> 
>    printf("pid = %d about to exit\n",pid);
>    return(0);
> }
>  
> ----- END
> 
> 
> Alfred Perlstein - Programmer, HotJobs Inc. - www.hotjobs.com
> -- There are operating systems, and then there's BSD.
> -- http://www.freebsd.org/

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199808191616.MAA06764>