Операционные системы реального времени. Программно-аппаратный экспериментальный комплекс, в составе которого инструментальный компьютер, страница 15

setbuf(stdout, 0);

printf("PROCESS_RECIVER STARTED\n");

// устанавливаем диспозицию сигнала sigusr1

signal(SIGUSR1, handler);

// Определяем id процесса

int my_id =  getpid();

// выводим id на экран

printf("my_id = %d\n", my_id);

// ждём в цикле сигнал

while(1) {

sleep(20);

}

return EXIT_SUCCESS;

}

// обработчик сигнала sigusr1

void handler (int signo)

{

printf("Process received signal SIGUSR1\n");

signal(SIGUSR1, handler);

}

Консоль:

PROCESS_RECIVER STARTED

my_id = 602153

Process received signal SIGUSR1

Результат профайлинга.

5.8.  Системный профайлинг для пульсов по сети.

Клиент отправляет пульс.

Текст программы:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <errno.h>

#include <unistd.h>

#include <sys/dispatch.h>

#include "header.h"

int main(void){

int coid;

int pulse;

char *p;

coid = name_open( ATTACH_POINT, NAME_FLAG_ATTACH_GLOBAL);

if(coid == -1){

printf("can not find server\n");

return EXIT_FAILURE;

}

else{

printf("START CLIENT pid #%d\n",getpid());

}

MsgSendPulse(coid, 12, 5, 1);

printf("client: pulse sending\n");

}

Сервер принимает пульс.

Текст программы:

#include <stdlib.h>

#include <stdio.h>

#include <sys/iofunc.h>

#include <sys/dispatch.h>

#include <sys/neutrino.h>

#include <string.h>

#include <errno.h>

#include "header.h"

void sig_int(void);

name_attach_t *attach;

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

char replybuf[64];

struct _pulse my_pulse;

int rcvid;

// СОЗДАЁМ КАНАЛ ДЛЯ ОБМЕНА СООБЩЕНИЯМИ

attach = name_attach(NULL, ATTACH_POINT,NAME_FLAG_ATTACH_GLOBAL);

if (attach == NULL){

printf("ERROR: %s\n",strerror(errno));

return EXIT_FAILURE;

}

else{

signal(SIGINT,sig_int);

printf("SERVER STARTED\n");

}

// ЖДЁМ СООБЩЕНИЯ

while(1){

rcvid = MsgReceive(attach->chid,&my_pulse,sizeof(my_pulse),NULL);

if (rcvid > 0){

//ЭТО СООБЩЕНИЕ

if (my_pulse.type = _IO_CONNECT){

MsgReply(rcvid,EOK,NULL,0);

continue;

}

else{

printf("server: msg received from %d\n", rcvid);

strcpy(replybuf,"Transfer is qood!\n");

MsgReply(rcvid,EOK,replybuf,sizeof(replybuf));

}

}

else if (rcvid == 0){

//ЭТО ПУЛЬС

//printf("qwe");

printf("server: received pulse: code=%d; value=%d;\n",my_pulse.code,my_pulse.value.sival_int);

}

else{

//ОШИБКА

printf("server: transfer failed\n");

return EXIT_FAILURE;

}

}

return EXIT_SUCCESS;

}

void sig_int(void){

printf("Terminate SERVER\n");

name_detach( attach, 0 );

exit(EXIT_SUCCESS);

}

5.9.  Системный профайлинг для сообщений независимых процессов (локальная реализация).

Сервер:

#include <stdlib.h>

#include <stdio.h>

#include <sys/iofunc.h>

#include <sys/dispatch.h>

#include <sys/neutrino.h>

#include <string.h>

#include <errno.h>

#include "msg_header.h"

name_attach_t *att;

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

{

int recid;

msg_my_t mes_rcv, mes_rpl;

att = name_attach(NULL,ATTACH_POINT, 0);

printf("server is turned on\n");

recid = MsgReceive(att->chid, &mes_rcv, sizeof(mes_rcv), NULL);

MsgReply(recid, EOK, &mes_rpl, sizeof(mes_rpl));

return EXIT_SUCCESS;

}

Клиент:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <errno.h>

#include <unistd.h>

#include <sys/dispatch.h>

#include "../msg_local_server/msg_header.h"

int main(void){

int coid;

int count=0;

msg_my_t msg_send, msg_reply;

coid = name_open( ATTACH_POINT, 0);

printf("START CLIENT\n");

MsgSend(coid, &msg_send, sizeof(msg_send), &msg_reply, sizeof(msg_reply));