UNIX & GNU/Linux - System calls - Using wait()

The wait() syscall is often used with the fork() syscall.

Indeed, with the wait() syscall we can be sure that the child will be executed before the parent process.
In a trivial vision, this is like mutexes for threads.

It means that without the following line, the parent and the child will be executed at the same time:

wait(&status);

If you want to try it, change the line:

while (i < 10)

by this one on both parent and child loops:

while (i < 100000)

They will be executed at the same time!

Let's see it in this wait() tutorial.

Using the wait() syscall

main.c

/**
 * Badprog.com
 * main.c
 */

#include        <stdio.h>
#include        <stdlib.h>
#include        <sys/types.h>
#include        <sys/wait.h>
#include        <unistd.h>
#include        <string.h>
#include        <errno.h>

typedef struct s_forky
{
    int value;
} t_forky;

int     main()
{
  int i;
  int status;
  pid_t f;
  t_forky forky;

  forky.value = 0;
  i = 0;
  status = 1;
  f = fork();
  if (f < 0)
    {
      fprintf(stderr, "Error: %s - fork() < 0 (%d)\n", strerror(errno), f);
    }
  else if (f > 0)
    {
      wait(&status);
      printf("\n===== Begin Parent =====\n\n");
      printf("fork() = %d\n", f);
      printf("getpid() = %d\n", getpid());
      while (i < 10)
      {
          printf(" Parent - forky.value = %d\n", forky.value);
          ++forky.value;
          ++i;
      }
    }
  else
    {
      printf("\n===== Begin Child =====\n\n");
      printf("fork() = %d\n", f);
      printf("getpid() = %d\n", getpid());
      while (i < 10)
      {
          printf("  Child - forky.value = %d\n", forky.value);
          ++forky.value;
          ++i;
      }
    }
  printf("status = %d\n", status);
  printf("forky.value = %d\n\n", forky.value);
  printf("===== End =====\n\n");
  return 0;
}

Compiling

gcc main.c -o forkIt ; ./forkIt

Output

===== Begin Child =====

fork() = 0
getpid() = 23817
  Child - forky.value = 0
  Child - forky.value = 1
  Child - forky.value = 2
  Child - forky.value = 3
  Child - forky.value = 4
  Child - forky.value = 5
  Child - forky.value = 6
  Child - forky.value = 7
  Child - forky.value = 8
  Child - forky.value = 9
status = 1
forky.value = 10

===== End =====


===== Begin Parent =====

fork() = 23817
getpid() = 23816
 Parent - forky.value = 0
 Parent - forky.value = 1
 Parent - forky.value = 2
 Parent - forky.value = 3
 Parent - forky.value = 4
 Parent - forky.value = 5
 Parent - forky.value = 6
 Parent - forky.value = 7
 Parent - forky.value = 8
 Parent - forky.value = 9
status = 0
forky.value = 10

===== End =====

So, are you wait() or not? wink

Add new comment

Plain text

  • No HTML tags allowed.
  • Lines and paragraphs break automatically.