IPCPOSIX на примере QNX Neutrino (Отчет о выполнении научно-исследовательской работы), страница 8

        sprintf (msgptr->buff, "Message from server with PID = %d\n",

getpid ());

        sem_post (&sem);

    };

    sem_close (&sem);

    close (fd);

    shm_unlink (name_shm);

    return 0;

}

Файл Client.с

#include <stdio.h>

#include <string.h>

#include <fcntl.h>

#include <errno.h>

#include <stdlib.h>

#include <unistd.h>

#include <limits.h>

#include <semaphore.h>

#include <sys/mman.h>

#define MAXBUFF 180

#define PERM 0666

typedef struct mem{

int segment;

char buff[MAXBUFF];

} message;

message *msgptr;

sem_t sem;

int fd;

int main () {

char *name_shm = "sh_name";

char *path_shm = "/sh_name";

fd = shm_open (name_shm, O_RDWR , 0);

ftruncate (fd, sizeof (*msgptr));

msgptr = mmap (0, sizeof(*msgptr), PROT_READ | PROT_WRITE,

MAP_SHARED, fd, 0);

sem = *sem_open (path_shm, O_EXCL, 0);

sprintf (msgptr->buff, "Message from client with PID = %d\n", getpid());

sem_post (&sem);

sem_wait (&sem);

printf ("Client: read message: %s", msgptr->buff);

close (fd);

shm_unlink (name_shm);

return 0;

}

Результаты:

#

# ./server&

[2] 753711

# ./client

Server: read message: Message from client with PID = 757808

Client: read message: Message from server with PID = 753711

В результате выполнения программы сообщения клиента и серверы были записаны в разделяемую память и прочитаны из нее корректно.

Выводы:

Ненадежные сигналы должны перезапускать обработчик внутри самого обработчика, если есть желание сохранить сигнал действующим. В случае надежных сигналов при отправке сигнала SIGINT в момент работы другого обработчика, блокирующего этот сигнал, по окончании работы этого обработчика запрос выполняется и процесс завершается.

Неименнованые каналы дают возможность обмена данными только между процессами-«родственниками», т.к. процесс может получить файловые дескрипторы для работы с неименнованнным каналом, только наследую их от родительского процесса.

Именованные каналы (FIFO) могут использоваться как средство взаимодействия между неродственными и даже удаленными процессами, хотя работают медленнее, чем неименованные.

Семафоры могут использоваться для обеспечения эксклюзивного доступа к ресурсам используемой машины. В данной работе было проведено исследование работы функций sem_open() sem_close() для создания и удаления именованных семафоров, для неименованных семафоров используются функции  sem_init() и sem_destroy().