по этому псевдокоду:

s = 0
N = input()

parent:
for i = 1 to N:
write(message)
A(s, 1)
Z(s) // передаём управление ребёнку
D(s, 1)
read(message)
print(message)
end

child:
for i = 1 to N:
D(s, 1)
read(message)
print(message)
write(message)
A(s, 1)
Z(s) // передаём управление родителю
end

мне нужно решить на языке си задачу:

Взяв за основу программу 05-3.с, реализуйте поочередную неоднократную передачу информации между ребёнком и родителем через один pipe в двух направлениях, используя ровно один IPC семафор. Считать, что сначала родитель передает данные ребёнку, а затем получает данные от него. Количество пар передача и приём данных в родителе и пар приём и передача в ребёнке равно N ≥ 2. Значение N вводится в родителе с клавиатуры до порождения ребёнка. Число N потенциально может быть достаточно большим и превышать максимально возможное значение семафора, поэтому использовать значение N в операциях над семафором не разрешается.

вот программа 05-3.с:
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
int fd[2], result;

size_t size;
char resstring[14];

if (pipe(fd) < 0) {
printf("Can't open pipe\n");
exit(-1);
}

result = fork();

if (result < 0) {
printf("Can't fork child\n");
exit(-1);
} else if (result > 0) {

/* Parent process */

if (close(fd[0]) < 0) {
  printf("parent: Can\'t close reading side of pipe\n"); exit(-1);
}

size = write(fd[1], "Hello, world!", 14);

if (size != 14) {
  printf("Can\'t write all string to pipe\n");
  exit(-1);
}

if (close(fd[1]) < 0) {
  printf("parent: Can\'t close writing side of pipe\n"); exit(-1);
}

printf("Parent exit\n");

} else {

/* Child process */

if (close(fd[1]) < 0) {
  printf("child: Can\'t close writing side of pipe\n"); exit(-1);
}

size = read(fd[0], resstring, 14);

if (size < 0) {
  printf("Can\'t read string from pipe\n");
  exit(-1);
}

printf("Child exit, resstring:%s\n", resstring);

if (close(fd[0]) < 0) {
  printf("child: Can\'t close reading side of pipe\n"); exit(-1);
}

}

return 0;
}

вот примеры работы кода с семафорами:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[], char *envp[])
{
  int   semid;
  char pathname[]="09-1a.c";
  key_t key;
  struct sembuf mybuf;

  if ((key = ftok(pathname,0)) < 0) {
    printf("Can\'t generate key\n");
    exit(-1);
  }

  if ((semid = semget(key, 1, 0666 | IPC_CREAT)) < 0) {
    printf("Can\'t create semaphore set\n");
    exit(-1);
  }
  //
  // Perform operation A(semid1,1) on the semaphore array.
  // But first fill in the structure. The flag, as usual, is set to 0.
  // The semaphore array consists of one semaphore with number 0.
  // The opcode is 1.
  //
  mybuf.sem_num = 0;
  mybuf.sem_op  = 1;
  mybuf.sem_flg = 0;

  if (semop(semid, &mybuf, 1) < 0) {
    printf("Can\'t add 1 to semaphore\n");
    exit(-1);
  }

  printf("The condition is present\n");
  return 0;
}

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>

int main()
{
  int     *array;
  int     shmid;
  int     new = 1;
  int     semid;
  char    pathname[] = "task1_1.c";
  key_t   key;
  long    i;
  struct sembuf mybuf;

  if ((key = ftok(pathname,0)) < 0) {
    printf("Can\'t generate key\n");
    exit(-1);
  }

  if ((shmid = shmget(key, 3*sizeof(int), 0666|IPC_CREAT|IPC_EXCL)) < 0) {
    if (errno != EEXIST) {
      printf("Can\'t create shared memory\n");
      exit(-1);
    } else {
      if ((shmid = shmget(key, 3*sizeof(int), 0)) < 0) {
        printf("Can\'t find shared memory\n");
        exit(-1);
      }
      new = 0;
    }
  }

  if ((array = (int *)shmat(shmid, NULL, 0)) == (int *)(-1)) {
    printf("Can't attach shared memory\n");
    exit(-1);
  }

  if ((semid = semget(key, 1, 0666 | IPC_CREAT)) < 0) {
    printf("Can\'t get semid.\n");
    exit(-1);
  }

  if (new) {
    array[0] =  0;
    array[1] =  0;
    array[2] =  0;

    mybuf.sem_op = 1;
    mybuf.sem_flg = 0;
    mybuf.sem_num = 0;

    if (semop(semid, &mybuf, 1) < 0) {
        printf("Can\'t do the condition.\n");
        exit(-1);
    }

    printf
        ("Program 1 was spawn %d times, program 2 - %d times, total - %d times\n",
        array[0], array[1], array[2]);
  } else{
    mybuf.sem_num = 0;
    mybuf.sem_op = -1;
    mybuf.sem_flg = 0;
    if (semop(semid, &mybuf, 1) < 0) {
        printf("Can\'t do the condition.\n");
        exit(-1);
    }

    array[0] += 1;
    for(i=0;i<20000000000L;i++);
    array[2] += 1;

    printf
        ("Program 1 was spawn %d times, program 2 - %d times, total - %d times\n",
        array[0], array[1], array[2]);

    mybuf.sem_op = 1;
    if (semop(semid, &mybuf, 1) < 0) {
        printf("Can\'t do the condition.\n");
    }
  }

  if (shmdt(array) < 0) {
    printf("Can't detach shared memory\n");
    exit(-1);
  }

  return 0;
}

тебе, наверное, нужно реализовать все функции A, D, Z и использовать их в коде. скопируй такой стиль и сделай код, похожим по стилю на эти, но который выполняет нужную задачу