Simple C program to demonstrate bug in fork(2)

Andrew Belashov bel at orel.ru
Wed Jul 30 09:37:46 PDT 2003


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

Normal output:

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


Bad output:

bel at trash$ ./forkbug
  Main: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Parent changed memory
Parent waiting a child...
Child working...
Child: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Child exiting...
Parent exiting...
-------------- next part --------------
#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);
}


More information about the freebsd-sparc64 mailing list