/*
- forks.c - Examples of Unix process control
*/
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
/*
- fork0 - The simplest fork example
- Call once, return twice
- Creates child that is identical to parent
- Returns 0 to child process
- Returns child PID to parent process
*/
void fork0()
{
if (fork() == 0) {
printf(“Hello from child\n”);
}
else {
printf(“Hello from parent\n”);
}
}
/*
-
fork1 - Simple fork example
-
Parent and child both run same code
-
Child starts with identical private state
*/
void fork1()
{
int x = 1;
pid_t pid = fork();if (pid == 0) {
printf(“Child has x = %d\n”, ++x);
}
else {
printf(“Parent has x = %d\n”, --x);
}
printf(“Bye from process %d with x = %d\n”, getpid(), x);
}
/*
- fork2 - Two consecutive forks
- Both parent and child can continue forking
- Ordering undetermined
*/
void fork2()
{
printf(“L0\n”);
fork();
printf(“L1\n”);
fork();
printf(“Bye\n”);
}
/*
- fork3 - Three consective forks
- Parent and child can continue forking
*/
void fork3()
{
printf(“L0\n”);
fork();
printf(“L1\n”);
fork();
printf(“L2\n”);
fork();
printf(“Bye\n”);
}
/*
- fork4 - Nested forks in parents
*/
void fork4()
{
printf(“L0\n”);
if (fork() != 0) {
printf(“L1\n”);
if (fork() != 0) {
printf(“L2\n”);
}
}
printf(“Bye\n”);
}
/*
- fork5 - Nested forks in children
*/
void fork5()
{
printf(“L0\n”);
if (fork() == 0) {
printf(“L1\n”);
if (fork() == 0) {
printf(“L2\n”);
}
}
printf(“Bye\n”);
}
void cleanup(void) {
printf(“Cleaning up\n”);
}
/*
- fork6 - Exit system call terminates process
- call once, return never
*/
void fork6()
{
atexit(cleanup);
fork();
exit(0);
}