2008-08-18 12 views
11

मैं अपना पहला पर्ल ऐप लिख रहा हूं - एक एओएल इंस्टेंट मैसेंजर बॉट जो एक आर्डिनो माइक्रोक्रोनरोलर से बात करता है, जो बदले में एक सर्वो को नियंत्रित करता है जो हमारे sysadmin के सर्वर पर पावर बटन दबाएगा, जो हर 28 घंटे या तो यादृच्छिक रूप से फ्रीज करता है।मैं पर्ल में अवरुद्ध किए बिना एसटीडीआईएन का परीक्षण कैसे कर सकता हूं?

मुझे सभी कड़ी चीजें मिल गई हैं, मैं मुख्य लूप को तोड़ने के लिए कोड का एक आखिरी बिट जोड़ने और उपयोगकर्ता को 'छोड़ने' के प्रकार से एआईएम से लॉग आउट करने का प्रयास कर रहा हूं।

समस्या यह है कि, यदि मैं मुख्य प्रोग्राम लूप में एसटीडीआईएन से पढ़ने की कोशिश करता हूं, तो यह तब तक प्रक्रिया को अवरुद्ध करता है जब तक कि इनपुट दर्ज नहीं किया जाता है, अनिवार्य रूप से बॉट निष्क्रिय होता है। मैंने पढ़ने से पहले ईओएफ के परीक्षण की कोशिश की है, लेकिन कोई पासा नहीं ... ईओएफ हमेशा झूठी वापसी करता है।

यहाँ नीचे है कुछ नमूना कोड के साथ मैं काम कर रहा हूँ है:

while(1) { 
    $oscar->do_one_loop(); 

# Poll to see if any arduino data is coming in over serial port 
    my $char = $port->lookfor(); 

# If we get data from arduino, then print it 
    if ($char) { 
     print "" . $char ; 
    } 

    # reading STDIN blocks until input is received... AAARG! 
    my $a = <STDIN>; 
    print $a; 
    if($a eq "exit" || $a eq "quit" || $a eq 'c' || $a eq 'q') {last;} 
} 

print "Signing off... "; 

$oscar->signoff(); 
print "Done\n"; 
print "Closing serial port... "; 
$port->close() || warn "close failed"; 
print "Done\n"; 

उत्तर

17

पर्ल में निर्मित select() है, जो एक पास के माध्यम से select() सिस्टम कॉल करने के लिए है, लेकिन समझदार लोगों के लिए मैं IO::Select की सिफारिश है ।

कोड का नमूना:

#!/usr/bin/perl 

use IO::Select; 

$s = IO::Select->new(); 
$s->add(\*STDIN); 

while (++$i) { 
    print "Hiya $i!\n"; 
    sleep(5); 
    if ($s->can_read(.5)) { 
    chomp($foo = <STDIN>); 
    print "Got '$foo' from STDIN\n"; 
    } 
} 
+4

किसी और के लिए बिग ध्यान दें, 'आईओ :: Select' केवल यूनिक्स पर काम करता है, विंडोज पर काम नहीं करता! – slm

+0

वास्तव में विंडोज़ पर सामान्य रूप से 'आईओ :: चयन' और 'चयन() '(कुछ) इंटरनेट-डोमेन सॉकेट के लिए काम करता है, लेकिन केवल यही है। विंडोज एक आश्चर्यजनक टूटा मंच है, इसलिए इस तरह के एक साधारण क्रॉस-प्लेटफार्म एपीआई पर सभी मामलों के लिए काम करने की अपेक्षा न करें। आपको सॉकेट के लिए एक चीज करना है, फाइलों/नामित पाइपों के लिए दूसरा, अज्ञात पाइप/"कंसोल" हैंडल इत्यादि के लिए दूसरा ... तथ्य यह है कि उन्होंने अपना 'पोल() 'WPAPoll' कहा है, केवल इसे ही काम किया है इंटरनेट सॉकेट, और इसमें ज्ञात बग को ठीक करने से इंकार कर दिया क्योंकि "मतदान() को बहिष्कृत किया गया है" ** ** दूर रहना एक चेतावनी होना चाहिए **। – alexchandel

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

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