Сигналы. Сетевая доставка сигналов. Системный вызов. Отправка сигнала процессу на удаленном узле. Программа приема сигнала, страница 6

3. Передача пульсов по таймеру.

            3.1. Посылка пульса по таймеру текущему процессу, которым был создан таймер.

Основная программа запускает таймер, который посылает уведомление о срабатывании пульсом, пульсы принимаются основной программой. После приема пульса выводится системное время.

Схема программы:


Листинг 3.1.1. 2_4_pulse_timer.c.

/*

* Посылка пульса по срабатыванию таймера самому себе

*/

#include <stdlib.h>

#include <stdio.h>

#include <time.h>

#include <signal.h>

#include <unistd.h>

#include <errno.h>

#include <sys/siginfo.h>

#include <sys/neutrino.h>

#define BUF_LEN 256

#define     ATTACH_POINT      "qnx_msg_server"

#define           BUF_LEN                 256

#define     CODE_TIMER        1

int channelId;

int Setup_Timer( );

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

{

int rcv_id;

time_t tmm;

struct tm *now;

channelId = ChannelCreate(0);

if ( channelId == -1 ) {

printf( "ChannelCreate error!\n" );

exit(1);

}

if (Setup_Timer( )==-1) {

printf( "Setup_Timer error!\n" );

exit(2);

}

struct _pulse PulseMsg;

while(1)

{

rcv_id = MsgReceivePulse(channelId, &PulseMsg, sizeof(PulseMsg), NULL );

if (rcv_id == -1) {

printf( "MsgReceivePulse error!\n" );

exit(3);

} else if (PulseMsg.code == CODE_TIMER) {

tmm = time( NULL );

now = localtime( &tmm );

printf("Recieve pulse. Time - %2.2d:%2.2d:%2.2d.\n", now->tm_hour, now->tm_min, now->tm_sec );

}

}

return EXIT_SUCCESS;

}

// Настройка таймера //

int Setup_Timer( )

{

timer_t timer_id;

struct sigevent timer_event;

struct itimerspec timer;

int connect_id;

connect_id = ConnectAttach(0,0,channelId,0,0);

if (connect_id == -1) {

printf( "ConnectAttach error.\n" );

return -1;

}

SIGEV_PULSE_INIT( &timer_event, connect_id, SIGEV_PULSE_PRIO_INHERIT, CODE_TIMER, 0 );

if (timer_create( CLOCK_REALTIME, &timer_event, &timer_id) == -1 ) {

printf( "timer_create error.\n" );

return -1;

}

timer.it_value.tv_sec = 1;

timer.it_value.tv_nsec = 0;

timer.it_interval.tv_sec = 1;

timer.it_interval.tv_nsec = 0;

timer_settime( timer_id, 0, &timer, NULL );

return 0;

}

Результаты работы программы. Программы запускались прямо из IDE(Run As C/C++ QNX Application). Результаты работы выводятся на консоль в IDE.

Recieve pulse. Time - 23:40:12.

Recieve pulse. Time - 23:40:13.

Recieve pulse. Time - 23:40:14.

Recieve pulse. Time - 23:40:15.

Recieve pulse. Time - 23:40:16.

Recieve pulse. Time - 23:40:17.   

Timeline и Tracelog работы программы.


           

На диаграмме отражены события — инициализация программы и обработка двух пульсов по таймеру с интервалом 1 секунда.


            3.2. Посылка пульса по таймеру заданному процессу.

Схема программы:


            Программа Client_timer имеет возможность отправлять сообщения серверу, которые вводятся с терминала и так же отправляет серверу пульсы по таймеру.

Программа сервер здесь используется из пункта 2.3.

Листинг 3.2.1. 2_4_pulse_timer_client.c.

/*

* Поcылка сообщений серверу и

* посылка пульса по срабатыванию таймера

*/

#include <stdlib.h>

#include <stdio.h>

#include <time.h>

#include <signal.h>

#include <unistd.h>

#include <string.h>

#include <errno.h>

#include <sys/dispatch.h>

#include <sys/siginfo.h>

#include <sys/neutrino.h>

#define      ATTACH_POINT "qnx_msg_server"

#define      BUF_LEN                   256

#define      CODE_TIMER          1

typedef union {

struct _pulse pulse_msg;

char msg_buff[ BUF_LEN ];

} Msg_T;

int    connect_id;

void   Sigint_Handler( int );

void   Setup_Timer( );

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

{

Msg_T  send_buff;

Msg_T  reply_buff;