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

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, 3sizeof(int), 0666|IPC_CREAT|IPC_EXCL)) < 0) {
if (errno != EEXIST) {
printf("Can't create shared memory\n");
exit(-1);
} else {
if ((shmid = shmget(key, 3sizeof(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 и использовать их в коде. используй такой же стиль кода, как выше. не используй комментарии в коде. реализуй всё точно так, как я просил: 1 пайп, 1 семафор, двухсторонняя связь.