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

            return -1;

      }

            num = read(fdr,buf,sizeof(buf));

            if( num < 0)

            {

                  printf("\nSERVER ERR (nothing to write)");

                  return -1;

            }          

            printf("SERVER: IN READ CHAN  [%s]\n",buf);

      printf("end server \n");

      return;

}

Входной файл inp.txt: 

first_line

some info

Результаты:

# ./server inp.txt &

[3] 4255782

[2] - Done (255)           ./server inp.txt

# file name inp.txt

# ./client

file name2 inp.txt 7

client read from file inp.txt

 [first_line

some info0В°"Гњ7В°o]

SERVER: IN READ CHAN  [first_line

some info0В°"Гњ7В°oU3В°]

end server

[3] + Done                 ./server inp.txt

#

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

V. Очереди сообщений

#include <mqueue.h>

mqd_t mq_open( const char * name,

int oflag,

... ) - открытие очереди сообщений

int mq_close( mqd_t mqdes ) - закрытие канала

int mq_unlink( const char* name ) - удаление канала

int mq_send( mqd_t mqdes,

const char * msg_ptr,

size_t msg_len,

unsigned int msg_prio ) - отправка сообщения в очередь

ssize_t mq_receive( mqd_t mqdes,

char* msg_ptr,

size_t msg_len,

unsigned int* msg_prio ) - принятие сообщения из очереди


Функциональные структуры программ

Рис.1. Функциональная структура клиента

Рис.2. Функциональная структура сервера

Листинги исходных кодов

posix_client.c

#include <mqueue.h>

#include <stdlib.h>

#include <stdio.h>

#include <sys/neutrino.h>

#include <errno.h>

#define PROGNAME "posix_client: "

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

      char *smsg = "HELLO! IT IS CLIENT"; // A pointer to a buffer that contains the message that we want to send

      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

      sleep( 2 );

      // Open a message queue

      if( (mq_des = mq_open("/serv_mq", O_WRONLY | 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

      // Send a message to a queue

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

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

           strlen( smsg )+ 1, // The size of the buffer

                 NULL ) == -1 ){

          perror( PROGNAME "mq_send" );

      exit( EXIT_FAILURE );

    }                       

//    printf ( "Message send\n " );

      mq_close( mq_des );

      return EXIT_SUCCESS;

}

posix_server.c

#include <mqueue.h>