logo
Литература_1 / photon_old

Пример – очередь сообщений

Это приложение, получающее импульсы Photon'а. Оно открывает очередь сообщений (/dev/mqueue/testqueue по умолчанию), устанавливает импульс, и использует функцию mq_notify(), чтобы отдать ему импульс, когда в очереди сообщений есть нечто для прочтения:

/* Стандартные хеадеры */

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

#include <mqueue.h>

#include <fcntl.h>

#include <errno.h>

#include <sys/stat.h>

/* Инструментальные хеадеры */

#include <Ph.h>

#include <Pt.h>

#include <Ap.h>

/* Локальные хеадеры */

#include "abimport.h"

#include "proto.h"

mqd_t mqd = -1;

struct sigevent sigev;

static void readqueue( void ) {

static unsigned counter;

unsigned mprio;

ssize_t msize;

char mbuf[ 4096 ];

while ( ( msize = mq_receive( mqd, mbuf, sizeof(mbuf), &mprio ) ) >= 0 ) {

char hbuf[ 40 ];

PtTextModifyText( ABW_mtext, 0, 0, -1, hbuf,

sprintf( hbuf, "Msg #%u (prio %d):\n", ++counter, mprio ));

PtTextModifyText( ABW_mtext, 0, 0, -1, mbuf, msize );

}

if ( errno != EAGAIN ) perror( "mq_receive" );

} // Функции readqueue()

static int input_fun( void *data, int rcvid, void *message, size_t mbsize ) {

readqueue();

if ( mq_notify( mqd, &sigev ) == -1 ) perror( "mq_notify" );

return Pt_HALT;

} // Функции input_fun()

pid_t pulse;

/* Строка опций приложения */

const char ApOptions[] = AB_OPTIONS ""; /* Добавьте Ваши опции в "" */

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

if (( pulse = PtAppCreatePulse( NULL, -1 ) ) = = 0

|| PtAppAddInput( NULL, pulse, input_fun, NULL ) = = NULL ) {

fputs( "Инициализация не удалась\n", stderr );

exit( EXIT_FAILURE );

}

PtPulseArm( NULL, pulse, &sigev );

/* предотвращает предупреждения (варнинги) об отсутствии ссылок */

argc = argc, argv = argv;

return( Pt_CONTINUE );

} // Функции init()

int open_queue( PtWidget_t *link_instance, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo ) {

const char *name;

PtArg_t arg;

if ( mqd >= 0 ) mq_close( mqd );

PtSetArg( &arg, Pt_ARG_TEXT_STRING, &name, 0 );

PtGetResources( ABW_qname, 1, &arg );

if ( ( mqd = mq_open( name, O_RDONLY | O_CREAT | O_NONBLOCK, S_IRUSR | S_IWUSR,

NULL ) ) < 0 )

perror( name );

else

if ( mq_notify( mqd, &sigev ) == -1 ) {

perror( "mq_notify" );

mq_close( mqd );

mqd = -1;

}

else

readqueue();

/* предотвращает предупреждения (варнинги) об отсутствии ссылок */

link_instance = link_instance, apinfo = apinfo;

cbinfo = cbinfo;

return( Pt_CONTINUE );

} // Функции open_queue()

Yandex.RTB R-A-252273-3
Yandex.RTB R-A-252273-4