2015-06-20 3 views
20

क्या जीएनयू प्रोलॉग के भीतर एक ऑपरेटिंग सिस्टम सिग्नल 'जाल' (उदा। 'पकड़') का कोई तरीका है? (मैं उबंटू/लिनक्स, नवीनतम gprolog का उपयोग कर रहा हूँ)।जीएनयू-प्रोलॉग में, क्या मैं एक लिनक्स सिग्नल पकड़ सकता हूं?

मुझे लगता है कि एक लंबे समय पहले मैं WAMCC में इस दृष्टिकोण का इस्तेमाल किया है, इससे पहले कि जीएनयू Prolog में बदल गया:

:- catch(Long_Running_Goal,signal(2),write('program interrupted')) 

लेकिन अगर मैं इस एक का उपयोग कर परीक्षण (दोहराने, असफल) के साथ अनंत लूप उदाहरण

के लिए,
:- catch((repeat,fail),X,write(X)). 

दुभाषिया Ctrl-C अब भी मुझे पता लगाने/डिबगर के लिए लेता है, और संकलित कार्यक्रम सिर्फ इस्तीफा अगर मैं इसे kill -1 साथ बीच में में, kill -2 आदि

मैंने डिफ़ॉल्ट रूप से सिग्नल को कैप्चर करने के मामले में --no-top-level के साथ प्रोग्राम को संकलित करने का प्रयास किया है, लेकिन इससे कोई फर्क नहीं पड़ता।

एसडब्ल्यूआई-प्रोलॉग में उपयुक्त अंतर्निहित भविष्यवाणी on_signal है जो उद्देश्य प्रदान करता है लेकिन यदि संभव हो तो मैं gprolog के साथ समाधान ढूंढ रहा हूं।

+1

हाय - अभी भी इस पर कुछ मदद की उम्मीद है ... लेकिन इस बीच मैं टिप्पणी कर सकता हूं कि आवश्यकता का कारण समानांतर प्रसंस्करण प्रयोगात्मक दृष्टिकोण है जहां प्रोलॉग निष्पादन योग्य किसी अन्य प्रक्रिया से बाधित हो सकता है, और उस बिंदु पर यदि एक 'राज्य' मान खांसी जो वर्तमान खोज में अपनी प्रगति का प्रतिनिधित्व करता है जैसे कि उस बिंदु से प्रसंस्करण को विभाजित किया जा सकता है और अन्य प्रोसेसर को सौंपा जा सकता है। इस क्षेत्र में काम का भरपूर हिस्सा है, लेकिन मेरा दृष्टिकोण इस इंटरप्ट क्षमता पर निर्भर करता है जो * wamcc में था। – Bambam

+1

@ बाम्ब: कोंडोर की तरह लगता है। वह राज्य कितना बड़ा है? एक निचले फीडर के रूप में, मैंने नियमित रूप से एक राज्य लिखा था। – false

+0

मैंने अभी काम किया है जहां से 'बक्षीस' आती है ... धन्यवाद झूठी। – Bambam

उत्तर

10

mescalinum के लिए धन्यवाद जिन्होंने signal handling is not available by default in GNU Prolog की पुष्टि की।

लेकिन जीएनयू प्रोलॉग में सी में उपयोगकर्ता दिनचर्या के लिए उत्कृष्ट समर्थन है, और मैं सी कोड की एक छोटी राशि लिखने में सक्षम हूं जो लिनक्स सिग्नल और ट्रिगर्स (यदि आवश्यक हो) को पकड़ता है तो एक प्रस्ताव अपवाद (नोट मेरा उबंटू 14.04 है/जीएनयू Prolog 1.3.0 तो init_signal समारोह के लिए सी प्रकार gprolog.h से Bool है - इस PlBool करने के बाद gprolog.h 1.3.1 में बदल गया है - 1.3.0 बनाम most recent मैनुअल देखें):

सी कोड "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 */ 
} 

प्रोलॉग परीक्षण में परीक्षण का उपयोग .pl "-" इस उदाहरण में लंबे समय से चल "क्वेरी o_query, एक 'पकड़' के संबंध में प्रयोग किया जाता है और SIGHUP से बाधित किया जा सकता है: gplc test.pl signal.c

अब साथ

:- 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. 

संकलित करता है, तो कार्यक्रम है ./test यह 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$ 

मेरी प्रयोजनों के लिए के साथ एक और टर्मिनल से बाधित किया जा सकता है के साथ चलाने के लिए, मैं उपयोगी भेजे अपवाद संभाल कर सकते हैं, जबकि मैं सी संकेत हैंडलर में हूँ, लेकिन यह एक Prolog 'के लिए दर्शाती वापस फेंक '(इस मामले में' तत्काल 'के साथ iation त्रुटि ') Prolog के भीतर कोड को व्यवस्थित रखता है।

कारण मैं निष्पादन जीएनयू प्रोलॉग प्रक्रिया के लिए एक सिग्नल भेजने (और पकड़ने) में सक्षम होना चाहता हूं क्योंकि मेरा सिस्टम एक उच्च प्रदर्शन समानांतर प्रसंस्करण प्रोलॉग पर्यावरण है जो किसी भी लंबे समय से चलने वाली प्रोलॉग प्रक्रिया को गतिशील रूप से ' खुद को कई भागों में विभाजित करें जो तब अन्य मशीनों पर निष्पादित होते हैं। लेकिन आप मौलिक रूप से (मेरी विधि के साथ) काम के सटीक वितरण की भविष्यवाणी नहीं कर सकते हैं और निश्चित रूप से वर्कलोड को आगे बढ़ाने के लिए अन्य प्रोसेसर बाधित हो जाएंगे (यानी एक सिग्नल भेजा जाएगा)।

+0

जीएनयू अब 1.4.4 रेस है। 1.4.5 ... – false

+0

एक प्रक्रिया कब विभाजित होगी? यह कितनी बार होता है? मेरे अनुभव में यह बल्कि (पूर्वोत्तर) डाउनटाइम है जो बड़े पैमाने पर समांतर कार्यों के साथ एक समस्या है। – false

+0

"प्रक्रिया कब विभाजित होगी? यह कितनी बार होती है?" - [लिंक] (https://www.repository.cam.ac.uk/handle/1810/221792) – Bambam

10

current gprolog source code को देख जहां signal() प्रयोग किया जाता है के बाद:

  • src/BipsPl/os_interf_c.c: signal(SIGPIPE, SIG_IGN);
  • src/EnginePl/LINUX_SIGSEGV.c: signal(SIGSEGV, (void (*)()) SIGSEGV_Handler);
  • src/EnginePl/PPC_SIGSEGV .c: signal(SIGSEGV, (void (*)()) SIGSEGV_Handler);
  • src/EnginePl/SOLARIS_SIGSEGV.c: signal(SIGSEGV, (void (*)()) SIGSEGV_Handler);
  • src/EnginePl/stacks_sigsegv.c: signal(SIGSEGV, (void (*)(int)) SIGSEGV_Handler);
  • src/EnginePl/WIN32_all_SIGSEGV.c: signal(SIGSEGV, (void (*)(int)) SIGSEGV_Handler);
  • src/Linedit/ctrl_c.c: signal(sig, Wrapper_Handler);
  • src/Linedit/ctrl_c.c : signal(SIGINT, Wrapper_Handler);

हम संकेतों के केवल उपयोग देख सकते हैं:

  • SIGINT संभाल करने आरईपीएल में (CTRL + सी दबाकर उत्पन्न)
  • SIGSEGV
  • संभाल करने SIGPIPE

अनदेखी करने के लिए तो यह संभव नहीं है, जब तक आप को तैयार हैं स्रोत कोड को संशोधित करने के लिए।

इसके अलावा, मुझे गिट प्रतिबद्ध संदेशों में any mention of signals नहीं मिला।

+1

धन्यवाद मेस्केलिनम ... वी बहुत सराहना की। शर्मिंदा है क्योंकि मैं वास्तव में * मेरे संकलित प्रोलॉग प्रोग्राम को बाधित करने की आवश्यकता है। मेरा अगला कदम यह देखना होगा कि क्या मैं सिग्नल पकड़ने के लिए कुछ सी में मिश्रण कर सकता हूं और थ्रो ट्रिगर कर सकता हूं ... – Bambam

संबंधित मुद्दे