Advanced Programming in the UNIX® Environment

(lily) #1
ptg10805159

Section 8.9 Race Conditions 247


We assume that the headerapue.hdefines whatever variables arerequired. The five
routinesTELL_WAIT,TELL_PARENT,TELL_CHILD,WAIT_PARENT,andWAIT_CHILD
can be either macros or functions.
We’ll show various ways to implement these TELLandWAITroutines in later
chapters: Section 10.16 shows an implementation using signals; Figure15.7 shows an
implementation using pipes. Let’s look at an example that uses these five routines.

Example


The program in Figure8.12 outputs two strings: one from the child and one from the
parent. The program contains a race condition because the output depends on the order
in which the processes arerun by the kernel and the length of time for which each
process runs.

#include "apue.h"
static void charatatime(char *);
int
main(void)
{
pid_t pid;
if ((pid = fork()) < 0) {
err_sys("fork error");
}else if (pid == 0) {
charatatime("output from child\n");
}else {
charatatime("output from parent\n");
}
exit(0);
}
static void
charatatime(char *str)
{
char *ptr;
int c;
setbuf(stdout, NULL); /* set unbuffered */
for (ptr = str; (c = *ptr++) != 0; )
putc(c, stdout);
}

Figure 8.12 Program with a race condition

We set the standardoutput unbuffered, so every character output generates awrite.
The goal in this example is to allow the kernel to switch between the two processes as
often as possible to demonstrate the race condition. (If we didn’t do this, we might
never see the type of output that follows. Not seeing the erroneous output doesn’t
Free download pdf