#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <unistd.h>
#include <stdio.h>

#define KEY ((key_t) 11111)
#define COUNT 20

#if defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED)
/*union semun ist in <sys/sem.h> definiert*/
#else /*Wir müssen es selbst definieren (siehe man-Page semctl)*/
union semun{
  int val;
  struct semid_ds *buf;
  unsigned short int *array;
  struct seminfo *__buf;
} ;
#endif

struct sembuf unlock[1]  = { 0, 1, 0};
struct sembuf lock[1]      =  { 0, -1, 0};

int main()
{
  int i, semid;
  union semun sem_val;

  if ( (semid = semget(KEY, 1, 0666 | IPC_CREAT)) < 0)
     exit(0);

  sem_val.val = 1;
  semctl(semid, 0, SETVAL, sem_val);

  for (i = 0; i < COUNT; i++)
   {
      sleep(1);
      if (semop(semid, &lock[0], 1) < 0)
          exit(0);
     printf("1"); fflush(stdout);
     sleep(1);
     if (semop(semid, &unlock[0], 1) < 0)
         exit(0);
     printf("0"); fflush(stdout);
   }
  printf("\n");
  if (semctl(semid, 0, IPC_RMID, (struct semid_ds *) 0) < 0)
     exit(0);
  exit(0);
}