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

#include <stdlib.h>

#include <stdio.h>

#include <sys/neutrino.h>

#include <errno.h>

#define PROGNAME "posix_server: "

int main(int argc, char *argv[]) {

      mqd_t mq_des;                // The message-queue descriptor, returned by mq_open()

      struct mq_attr mq_stat; // Structure to store the attributes of the message queue

      char *msg [ 512 ];           // A pointer to a buffer where the function can store the received data

      // Open a message queue

      if( (mq_des = mq_open("/serv_mq", O_RDONLY | O_CREAT, 0777, NULL)) == -1){

      perror( PROGNAME "mq_open" );

      exit( EXIT_FAILURE );

    }

      // Get a message queue's attributes

      mq_getattr( mq_des,          // The message-queue descriptor, returned by mq_open()

                        &mq_stat);  // Structure to store the attributes of the message queue

      while ( 1 ){

      // Receive a message from a queue

      if( mq_receive ( mq_des,                 // The ID of a channel that we established by calling ChannelCreate()

                        msg,              // A pointer to a buffer where the function can store the received data

                              mq_stat.mq_msgsize,     // The size of the buffer

                        NULL ) == -1 ){

          perror( PROGNAME "mq_receive" );

      exit( EXIT_FAILURE );

    }                       

//    printf ( "Receive message: = %s \n ", msg );

      }

    mq_close(mq_des);

    mq_unlink("/serv_mq");

      return EXIT_SUCCESS;

}

Результаты:

# ./server&

[1] 700462

# ./client

Receive message: = HELLO! IT IS CLIENT

Message send

 #

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

VI. Семафоры и разделяемая память

Последовательность действий: 
- откомпилировать программы (gcc -o server server.c; gcc -o client client.c) 
- запустить на выполнение исполняемый модуль ./server 
- запустить на выполнение исполняемый модуль ./client 
Сервер ожидает начала работы клиента, после чего ждет освобождения разделяемой памяти, блокирует ее и читает сообщение. Затем сервер пишет сообщение в разделяемую память и освобождает ресурс.

Файл Server.с

#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 80

#define PERM 0666

typedef struct mem{

     int segment;

     char buff[MAXBUFF];

} message;

int fd, val_wait;

message* msgptr;

sem_t sem;

int main () {

    char        *name_shm = "sh_name";

    char        *path_shm = "/sh_name";

    sem_close (&sem);

    shm_unlink (path_shm);

    fd = shm_open (name_shm, O_RDWR | O_CREAT, 0666);

    ftruncate (fd, sizeof(*msgptr));

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

MAP_SHARED, fd, 0);   

    sem = *sem_open(path_shm, O_CREAT  , S_IRWXG, 0);

    if ((int) & sem == -1) {

        printf ("Error: can't use sem_open");

        return -1;

    }

    while (1) {

        val_wait = sem_wait (&sem);

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