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
[-- Attachment #1 --]
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...
[-- Attachment #2 --]
#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);
}
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3F27F457.8030401>
