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));
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.