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