2012-07-25 14 views
5

stdin को सुन मैं एक जावा प्रोग्राम है जो उपयोगकर्ता द्वारा प्रवेश करती 0 यह बाहर निकलने चाहिए बनाने के लिए किया है। जावा कोड में कोई समस्या नहीं लिख रही है।पृष्ठभूमि प्रक्रिया

int cmd = read(); 
System.out.println("got command : " + cmd); 
if (cmd == 48) { // ASCII code for 0 
System.exit(0); 

मैं इस प्रक्रिया को लिनक्स में स्टार्ट-स्टॉप स्क्रिप्ट का उपयोग करना चाहता हूं। मैं भी कि & या nohup

case "$1" in  
    'start') 
    if [ -f myfifo ]; then 
     rm myfifo 
    fi 
    mkfifo myfifo 
    cat > myfifo & 
    echo $! > myfifo-cat-pid 
    java -jar myjar.jar >/dev/null 2>&1 0<myfifo & 
    echo "Started process: "$! 
    ;; 

    'stop') 
    echo 0 > myfifo 
    echo "Stopped process: " 
    rm myfifo 
    ;; 
esac 

मेरे समस्या का उपयोग कर के रूप में जल्द मैं इस प्रक्रिया को यह इनपुट पढ़ने -1 चलाने के रूप में है ऐसा करने में सक्षम किया जा रहा हूँ। जबकि मैं stdinput से पढ़ना चाहता हूं, जब कुछ इसे स्पष्ट रूप से प्रतिबिंबित किया जाता है यानी स्टॉप कहा जाता है। बस मुझे शैल स्क्रिप्ट द्वारा स्पष्ट रूप से बंद करने के लिए एक प्रोग्राम की आवश्यकता है। मैंने कड़ी मेहनत की है। मेरी मदद करो।

संपादित करें:

मैं सिर्फ कार्यक्रम बंद करने के लिए जब उपयोगकर्ता प्रेस क्ष या किसी ऐसी घटना और न कोड में अनंत लूप चाहते हैं। अन्य घटनाओं को सुनने जैसी कोई अन्य दृष्टिकोण भी यदि संभव हो तो भी मदद करेगी। मेरा कोड घटना के लिए मतदान नहीं होना चाहिए। मैंने Jnotify की कोशिश की है जो एक निर्देशिका देखता है और उस फ़ाइल में फ़ाइल बनाई या हटाए जाने पर एक ईवेंट उत्पन्न करता है। लेकिन मुश्किल भाग्य वे SunOS के लिए समर्थन नहीं है। :(

+0

आप मूल्य कैसे पढ़ते हैं? System.in.read() का उपयोग कर – poussma

+0

; इसके अलावा मैं BufferReader –

+0

हम का उपयोग कर इसे करने की कोशिश की है ... क्या आप वाकई myfifo मौजूद है और वहाँ में कुछ भी होता है? System.in.read() ठीक काम करने के लिए है ... 'mkfifo' क्या करता है? – poussma

उत्तर

0

आप अपने खोल स्क्रिप्ट के शीर्ष पर set -m का उपयोग करते हैं (इसलिए जबरदस्ती काम पर नियंत्रण में सक्षम है), तो आप एक संगत व्यवहार देखना चाहिए।

1

आप अभी तक पाइप में कोई डेटा नहीं है के बाद से, read() धारा के अंत में देखता है और इस वजह से यह -1 देता है। धारा से पढ़ने यकीन है कि यह में जानकारी है कि वहाँ होना करने के लिए इससे पहले कि available() पर कॉल करें।

3

ठीक है, वास्तव में fifo फ़ाइलें वास्तव में व्यवहार करते हैं लगता नहीं कि आप कल्पना के रूप में

read() आदेश एक पाइप पर अवरुद्ध नहीं है आप पाश जब तक आप डेटा प्राप्त करना चाहिए:।।

try { 
     bis = new BufferedInputStream(System.in); 
     while (true) { 
      byte[] buffer = new byte[4096]; 
      if (bis.available() > 0) { 
       bis.read(buffer, 0, bis.available()); 
       // do some clever thing 
      } else { 
       try { 
        Thread.sleep(50); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } catch (IOException e) { 
     // it failed... 
    } 

यह पढ़ने के लिए कोशिश करेंगे और अगर वहाँ कुछ भी नहीं है, तो यह 50 एमएस के लिए इंतजार करेंगे।

एम

+0

मैं यह उल्लेख करना भूल जाता हूं कि मैंने लूप के दौरान भी ऐसा किया है लेकिन फिर यह लगातार स्टडीन से पढ़ेगा कि मैं नहीं चाहता कि उपयोगकर्ता इसे भेजता है जब तक कि यह एक infinte पाश नहीं बनता सही आदेश :( –

+0

आपकी ज़रूरत क्या है? अपने कार्यक्रम में कुछ करें और एक ही समय में stdin सुनें? और जब उपयोगकर्ता "क्यू" दबाता है तो यह आपके प्रोग्राम को रोकता है? – poussma

+0

हां, जिसकी मुझे ज़रूरत है। लेकिन कार्यक्रम पृष्ठभूमि में चलना चाहिए –

0

जब आप एक स्क्रिप्ट है कि आदेश की stdin परोक्ष /dev/null से रीडायरेक्ट कर दिया जाता में एक कमांड पृष्ठभूमि।

# test by executing a script with ... 
- cat > myfifo & lsof -p $! 
+ cat 0<&0 > myfifo & lsof -p $!