Dzięki mescalinum, który potwierdził signal handling is not available by default in GNU Prolog.
Ale GNU Prolog ma doskonałe wsparcie dla procedur użytkownika w C, i byłem w stanie napisać niewielką ilość kodu C, który przechwytuje sygnał Linuxa i uruchamia (w razie potrzeby) wyjątek Prolog (uwaga moja to Ubuntu 14.04/GNU Prologa 1.3.0 więc typu C init_signal
funkcji jest Bool
z gprolog.h - zmieniło w gprolog.h 1.3.1 dalej do PlBool
- patrz 1.3.0 vs most recent instrukcje)
kodu C "signal.c" :
#include <stdio.h>
#include <signal.h>
#include <gprolog.h>
/* signal handler */
void sig_handler(int signo)
{
if (signo == SIGHUP)
{
printf("received SIGHUP\n");
/* throw Prolog exception */
Pl_Err_Instantiation();
}
}
/* GNU Prolog goal that registers the signal handler */
/* declared with :- foreign(init_signal). */
Bool init_signal()
{
if (signal(SIGHUP, sig_handler) == SIG_ERR)
{
printf("\ncan't catch SIGHUP\n");
}
printf("%s","SIGHUP handler registered\n");
return TRUE; /* succeed */
}
Zastosowanie testu w Prologu "test .pl”- w«długotrwały»kwerendy w tym przykładzie jest o_query, wykorzystywane w«catch»relacji i może być przerwany z SIGHUP:
:- foreign(init_signal).
:- initialization(main).
main :- write('Prolog signal test program started'),
nl,
init_signal,
catch(o_query,X,write('Prolog exception thrown')),
nl,
halt.
o_query :- repeat,
sleep(1),
fail.
skompilować z gplc test.pl signal.c
Teraz, jeśli program jest uruchomić z ./test może zostać przerwane z innego terminala z kill -1 <test process id>
[email protected]:~/prolog/signal$ ./test
Prolog signal test program started
SIGHUP handler registered
received SIGHUP
Prolog exception thrown
[email protected]:~/prolog/signal$
do moich celów, mogę z powodzeniem obsłużyć wyjątek przychodzące, gdy jestem w obsługi sygnału C, ale odzwierciedlające go z powrotem do Prologu " throw "(w tym przypadku z" instant " iation error ") utrzymuje porządek w kodzie Prolog.
Powodem, dla którego chcę być w stanie wysłać (i złapać) sygnał do wykonywanego procesu GNU Prolog, jest to, że mój system jest środowiskiem przetwarzania Prologu o wysokiej wydajności, które może dynamicznie uruchamiać każdy długotrwały proces Prologa. podzielić się na wiele części, które następnie można wykonać na innych maszynach. Ale zasadniczo nie możesz (z moją metodą) przewidzieć dokładnego podziału pracy, a we właściwym czasie inne procesory zostaną przerwane (tj. Wysłany sygnał) w celu dalszego podziału obciążenia.
Witam - wciąż mam nadzieję na jakąś pomoc w tej sprawie ... ale w międzyczasie mogę powiedzieć, że powodem tego wymagania jest eksperymentalne podejście do przetwarzania równoległego, w którym plik wykonywalny Prolog może zostać przerwany przez inny proces iw tym momencie jeśli kaszle w górę wartość "stanu", która reprezentuje jej postęp w bieżącym wyszukiwaniu, tak że przetwarzanie może zostać podzielone z tego punktu i przypisane do innych procesorów. W tej dziedzinie jest dużo pracy, ale moje podejście zależy raczej od tej możliwości przerwań, która * była * w WEGCC. – Bambam
@Bamb: brzmi bardzo podobnie do Condora. Jak duży jest ten stan? Jako dolny dostawca regularnie pisałem państwo. – false
Właśnie dowiedziałem się, skąd pochodzi "nagroda" ... dzięki fałszywej. – Bambam