Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Rekomendowane odpowiedzi

Opublikowano

KOMUNIKACJA Z PROCESEM ZA POMOCĄ SYGNAŁU

 

Witajcie, chciałbym Wam przedstawić możliwość komunikowania się z procesem za pomocą sygnałów.
 

kill -SIGNAME PID

Za pomocą wyżej wymienionego wyrażenia możemy wygenerować sygnał.
 
SIGNAME - nazwa sygnału (aby zobaczyć listę dostępnych  sygnałów w systemie, wpisz 'kill -l', polecam również poszukać opis sygnałów w google, np: tutaj)
PID - identyfikator procesu (aby znaleźć PID procesu wpisz 'ps')
 
Oczywiście sygnał musi być obsłużony, dlatego sygnały takie jak HUP, INT czy TERM są już obsłużone jako zamknięcie procesu.

Więcej teorii pisać nie ma sensu, na necie jest lepiej i więcej :3


Zastanawiacie się pewnie co ma to w związku ze światem Metina. Otóż może Wam się przyda, aby przy uruchomionym procesie można było na bieżąco zmieniać.

Poniżej przedstawię jak można zmienić, aby włączanie serwera w trybie testowym nie musiało wiązać się ze zmianą w CONFIG'u i restarcie procesu.

Taki daje przykład, także inne wykorzystanie jest tylko ograniczone przez Waszą wyobraźnię. :)

 

INFORMACJE:


Otwieramy \***\libthecore\src\signal.c, zjeżdżamy na sam dół do funkcji 'signal_setup()' i widzimy takie coś:
 

void signal_setup(void)
{
    signal_timer_enable(30);
 
    signal(SIGVTALRM, checkpointing);
 
    /* just to be on the safe side: */
    signal(SIGHUP, hupsig);
    signal(SIGCHLD, reap);
    signal(SIGINT, hupsig);
    signal(SIGTERM, hupsig);
    signal(SIGPIPE, SIG_IGN);
    signal(SIGALRM, SIG_IGN);
    signal(SIGUSR1, usrsig);
}
 
Jak widzimy sygnały takie jak HUP, INT, TERM są obsługiwane funkcją 'hupsig', która zmienia zmienną 'shutdowned' na 1, co w konsekwencji wyłącza proces.
Kolejną ciekawostką jest, że za pomocą sygnału USR1 może zrobić core_dump'a.


 

ZACZYNAMY!


1. [Plik: \***\libthecore\src\signal.c] W funkcji 'signal_setup()' dodajemy
 

signal(SIGUSR2, test_server);
 
 
2. [Plik: \***\libthecore\src\signal.c] Nad tą funkcją dodajemy
 
RETSIGTYPE test_server(int sig)
{
if (tested == FALSE)
tested = TRUE;
else
tested = FALSE;
 
sys_err("SIG_USR2 -- test_server change to %s", (tested) ? "TRUE" : "FALSE");
}
 
3.  [Plik: \***\libthecore\include\main.c] Pod

extern volatile int shutdowned;

dodajemy

extern volatile int tested;

 
4. [Plik: \***\libthecore\include\main.c] Pod

extern int thecore_is_shutdowned(void);

dodajemy

extern int thecore_is_tested(void);
extern void thecore_set_tested(int mode);

 
5. [Plik: \***\libthecore\src\main.c] Pod

volatile int shutdowned = FALSE;

dodajemy

volatile int tested = FALSE;

 
6. [Plik: \***\libthecore\src\main.c] Na samym końcu pliku

int thecore_is_tested(void)
{
return tested;
}
 
void thecore_set_tested(int mode)
{
tested = mode;
}

 
6. [Plik: \***\game\src\config.cpp] W 
 
TOKEN("test_server")
 
zmieniamy na np.
 
TOKEN("test_server")
{
printf("-----------------------------------------------\n");
 
printf("THECORE_TEST_SERVER: ");
int value = 0;
str_to_number(value, value_string);
thecore_set_tested(value);
 
if (test_server)
{
printf("ON\n");
}
else
{
printf("OFF\n");
}
 
printf("-----------------------------------------------\n");
continue;
}
 
7. I teraz wystarczy spędzić trochę czasu na zmianie w całym projekcie wszystkich

if (test_server)

na
[/code]if (thecore_is_tested())[/code]
 
Po poprawnej skompilowaniu i uruchomieniu w procesów w konsoli wpisujemy

kill -USR2 PID

Efektem będzie zmiana, jeśli był włączony tryb testowy to będzie wyłączony i odwrotnie po wysłaniu kolejnego sygnału.



Zawartość tematu jest napisana od podstaw tylko przeze mnie! Nie pozwalam na dalszą dystrybucję.


PS. Wygląd tematu i ewentualne literówki i błędy poprawię w wolnym czasie.

Opublikowano

Przydatne  <3 Plusik 

POSTY: [50] [75] [100] [150] [200] [250] [300] [350] [400] [450] [500] [550] [600] [650] [700] [750] [800] [850] [900] [950] [1000]


1817914831025941486533.png


 Ważne !   Pisząc/Odpisując wpisz w poście @Pesi

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...