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

#define MY_PULSE2  _PULSE_CODE_MINAVAIL+2

struct mes{

   short type;

   struct sigevent event;

};

int main(){

      int   fd, rcvid, chid, coid;

      struct _pulse pulse;

      name_attach_t *attach;

      struct sigevent   event;

      chid = ChannelCreate( 0 );

      coid = ConnectAttach( 0, 0, chid, 0, 0 );

      fd = name_open( PATH, 0 );

      if( fd == -1 ){

            printf("Client name open error\n" );

            exit( EXIT_FAILURE );

      }

        SIGEV_PULSE_INIT( &event, coid, SIGEV_PULSE_PRIO_INHERIT,

                    MY_PULSE2, 0 );

      MsgSendPulse( fd, 10, MY_PULSE1, 21 );  

      MsgSendPulse( fd, 10, MY_PULSE2, 8 );   

      name_close( fd );

      return 0;  

}

Server

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <errno.h>

#include <sys/neutrino.h>

#include <sys/iomsg.h>

#include <sys/iofunc.h>

#include <sys/dispatch.h>

#define ATTACH_POINT "channel_msg_"

#define MY_PULSE1  _PULSE_CODE_MINAVAIL+1

#define MY_PULSE2  _PULSE_CODE_MINAVAIL+2

int main(){

      name_attach_t *attach;

      int   rcvid, val, coid;

      struct _pulse     pulse;

      struct sigevent   event;

      if ((attach = name_attach(NULL, ATTACH_POINT, 0)) == NULL) {

            printf("name attach fail\n");

      return EXIT_FAILURE;

      }

      coid = ConnectAttach( 0, 0, attach->chid, 0, 0 );

      while(1){

            rcvid = MsgReceivePulse( attach->chid, &pulse, sizeof( pulse ), NULL );

            if( pulse.code > 0 ){

            //User Pulse

                  switch( pulse.code ){

                        case MY_PULSE1:

                             printf("Get Pulse 1 : value = %d\n", pulse.value.sival_int );

                        break;

                        case MY_PULSE2:

                             printf("Get Pulse 2 : value = %d\n", pulse.value.sival_int );

                        break;

                  }//end switch

            } else{

                  printf("Get system pulse\n");

                  if( pulse.code == _PULSE_CODE_DISCONNECT )

                        printf("Client disconnect\n");

             }

      }//end while(1)

      name_detach(attach, 0);

      return 0;

}

Для упрощения отсортируем информацию окна Trace Event Log, оставив только Communication.

Рис. 14

Рис. 15

Рис. 16

При выполнении данной программы клиент отправляет подряд 2 пульса (с разницей 34 мкс), что отображено на рис. 15. Далее пульсы принимаются и обрабатываются сервером. При этом на доставку первого пульса (рис. 16) уходит  454 мкс, что значительно больше, чем в предыдущем варианте отправки пульса.

Обмен сообщениями между потоками одного процесса:

#include <pthread.h>

#include <stdio.h>

#include <sys/iofunc.h>

#include <sys/dispatch.h>

#include <stdlib.h>

#include <stddef.h>

#include <process.h>

pthread_t t1, t2;

void* thread1( void* );

void* thread2( void* );

int main()