Conditional move experiments

example2.c source

Project updated · 12 May 2010

/*
 * example3.c
 * - Example program for the "Emulating the CMOV instruction" article.
 * - In this example the parent clears SIGTERM generated by the child.
 * 
 * Michal Ludvig <michal@logix.cz> (c) 2003
 * Homepage: /devel/cmov-article
 *
 * This code is public domain. Use it as you want to, 
 * but don't blame me if something doesn't work as you 
 * expect.
 */

#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/ptrace.h>

void child ()
{
    ptrace (PTRACE_TRACEME, 0, NULL, NULL);
    kill (getpid (), SIGTERM);
    exit (5);
}

void parent ()
{
  int status;
  pid_t pid;

  while ((pid = wait4 (-1, &status, WUNTRACED, NULL)) >= 0)
    {
      printf ("PID[%lu]: ", pid);
      if (WIFEXITED (status))
        printf ("WEXITSTATUS: %d\n", WEXITSTATUS (status));
      else if (WIFSIGNALED (status))
        printf ("WTERMSIG: %d (%s)\n", WTERMSIG (status),
                strsignal (WTERMSIG (status)));
      else if (WIFSTOPPED (status))
        {
          int signal = WSTOPSIG (status);
          printf ("WSTOPSIG: %d (%s)\n", signal, strsignal (signal));
          if (signal == SIGTERM)
            signal = 0;
          ptrace (PTRACE_CONT, pid, NULL, signal);
        }
    }
}

int
main ()
{
  if (fork ())
    parent ();
  else
    child ();

  exit (0);
}