Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 30 Jul 2003 20:37:43 +0400
From:      Andrew Belashov <bel@orel.ru>
To:        freebsd-sparc64@freebsd.org
Subject:   Simple C program to demonstrate bug in fork(2)
Message-ID:  <3F27F457.8030401@orel.ru>

next in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------070807040700090203040900
Content-Type: text/plain; charset=us-ascii; format=flowed
Content-Transfer-Encoding: 7bit

I have written the small program for demonstrate bug in fork(2).

Normal output:

bel@bel$ ./forkbug
  Main: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Child working...
Parent changed memory
Child: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Parent waiting a child...
Child exiting...
Parent exiting...


Bad output:

bel@trash$ ./forkbug
  Main: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Parent changed memory
Parent waiting a child...
Child working...
Child: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Child exiting...
Parent exiting...

--------------070807040700090203040900
Content-Type: text/plain;
 name="forkbug.c"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="forkbug.c"

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

#define BUFFLEN (128 * 1024 * 1024) /* 128 Mb */
#define CHECKLEN 60

char * buff;

void docheck(const char * prefix);

int main()
{
 int i;
 pid_t pid;
 
 if ((buff = (char *) malloc(BUFFLEN)) == NULL) {
  perror("Out of memory"); exit(1);
 }
 memset(buff, 'a', BUFFLEN);
 buff[BUFFLEN-1] = '\0';
 docheck(" Main");
 if ((pid = fork()) == -1) {
  perror("fork() failed"); exit(1);
 }
 if (pid) {
  memset(buff + BUFFLEN - 1 - CHECKLEN, 'b', CHECKLEN/2);
  printf("Parent changed memory\n");
  printf("Parent waiting a child...\n");
  wait(&i);
  printf("Parent exiting...\n");
 } else {
  printf("Child working...\n");
  docheck("Child");
  printf("Child exiting...\n");
 }
 return 0;
}

void docheck(const char * prefix)
{
 printf ("%s: %s\n", prefix, buff + BUFFLEN - 1 - CHECKLEN);
}

--------------070807040700090203040900--



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