How to create unix process binary trees? How to create unix process binary trees? unix unix

How to create unix process binary trees?


The waitpid() function requires arguments.

The initial childpid = fork(); is unexpected.

You can sensibly write:

for (int i = 0; i < 1; i++)

for the loops unless you insist on using C89 instead of C99 syntax.

Attempt 2

Example output

Start 46480i am 46480, my parent is 30775i am 46482, my parent is 46480i am 46481, my parent is 46480i am 46483, my parent is 46481i am 46484, my parent is 46482i am 46486, my parent is 46482i am 46487, my parent is 46483Exit 46487i am 46488, my parent is 46484Exit 46488i am 46485, my parent is 46481i am 46491, my parent is 46484Exit 46491i am 46489, my parent is 46483Exit 46489Exit 46483i am 46492, my parent is 46486Exit 46492Exit 46484i am 46490, my parent is 46486Exit 46490i am 46493, my parent is 46485Exit 46493Exit 46486Exit 46482i am 46494, my parent is 46485Exit 46494Exit 46485Exit 46481Exit 46480

Example source

#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <sys/wait.h>static pid_t fork_ok(void){    pid_t pid;    if ((pid = fork()) < 0)    {        fprintf(stderr, "Fork failure in pid %d\n", (int)getpid());        exit(1);    }    return pid;}int main(void){    fprintf(stderr, "Start %d\n", (int)getpid());    for (int level = 0; level < 3; level++)    {        if (fork_ok() == 0 || fork_ok() == 0)            continue;        break;    }    fprintf(stderr, "i am %d, my parent is %d\n",            (int)getpid(), (int)getppid());    while (wait(0) > 0)        ;    fprintf(stderr, "Exit %d\n", (int)getpid());    return(0);}

This uses a loop, a somewhat unusual loop. At each level, the parent process forks two children; the children each 'continue' to the next level, while the parent is done and exits the loop. The clean up code is the same as before (see below).

Recursive variant

#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <sys/wait.h>static pid_t fork_ok(void){    pid_t pid;    if ((pid = fork()) < 0)    {        fprintf(stderr, "Fork failure in pid %d\n", (int)getpid());        exit(1);    }    return pid;}static void new_level(int level){    if (level > 3)        return;    if (fork_ok() == 0 || fork_ok() == 0)        new_level(level+1);    else    {        printf("i am %d, my parent is %d\n",                (int)getpid(), (int)getppid());        while (wait(0) > 0)            ;        printf("Exit %d\n", (int)getpid());    }}int main(void){    printf("Start %d\n", (int)getpid());    fflush(0);    new_level(0);    return(0);}

Attempt 1

I'm not convinced you need any loops. This seemed to do the trick for me:

Example output

Start 44397i am 44397, my parent is 30775i am 44400, my parent is 44397i am 44401, my parent is 44397Exit 44401i am 44399, my parent is 44397i am 44398, my parent is 44397i am 44404, my parent is 44400Exit 44404i am 44403, my parent is 44399i am 44402, my parent is 44398i am 44405, my parent is 44398i am 44407, my parent is 44398Exit 44407Exit 44400i am 44406, my parent is 44399Exit 44406i am 44408, my parent is 44402i am 44410, my parent is 44402i am 44411, my parent is 44405Exit 44410Exit 44411i am 44409, my parent is 44403Exit 44409Exit 44405i am 44412, my parent is 44408Exit 44412Exit 44403Exit 44399Exit 44408Exit 44402Exit 44398Exit 44397

Source Code

#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <sys/wait.h>int main(void){    fprintf(stderr, "Start %d\n", (int)getpid());    if (fork() < 0 || fork() < 0 || fork() < 0 || fork() < 0)    {        fprintf(stderr, "Fork failure in pid %d\n", (int)getpid());        exit(1);    }    fprintf(stderr, "i am %d, my parent is %d\n",            (int)getpid(), (int)getppid());    while (wait(0) > 0)        ;    fprintf(stderr, "Exit %d\n", (int)getpid());    return(0);}