2012-06-20 21 views
5

मैं ProcessProcessBuilder के माध्यम से सी कोड में निष्पादन योग्य चलाने के लिए उपयोग कर रहा हूं। मैं इस निकास मूल्यों पर प्रतिक्रिया करने के लिए Process.exitValue() को पकड़ रहा हूं। मैंने देखा कि सभी निकास मूल्य निष्पादन योग्य नहीं हैं। उदाहरण के लिए, मुझे 13 9 का एक्जिट वैल्यू मिलता है और मेरे सी कोड में कहीं भी मैं 13 9 का एक्जिट वैल्यू वापस कर रहा हूं।Java Process.exitValue() से मानों का अर्थ क्या है?

मैं बाहर निकलने वाले मूल्यों का अवलोकन ढूंढने की कोशिश कर रहा हूं, लेकिन मुझे यह नहीं मिला, और अब मुझे मिला निकास मूल्य बाहर ओएस निर्भर हो सकता है। (मैं रास्ते से उबंटू का उपयोग कर रहा हूं)।

यह सब कुछ ठीक होने पर 0 के बारे में सुनिश्चित होने के लिए एकमात्र निकास मूल्य लगता है। क्या बाहर निकलने वाले मूल्यों के बारे में विनिर्देश हैं? क्या मुझे यकीन है कि एक निश्चित सीमा का उपयोग केवल अपने स्वयं के कार्यक्रम के लिए किया जा सकता है? ओएस के लिए कौन से निकास कोड आरक्षित हैं।

मुझे पता चला कि 13 9 शायद सी कोड में स्मृति त्रुटि है। मैं शायद से छुटकारा पाना चाहता हूँ। मैं बाहर निकलने से कोई भी मान सिंहावलोकन नहीं मिल सकता है (उदाहरण के लिए 139 = .....)

इस तरह से सरल कोड है:

ProcessBuilder p = new ProcessBuilder(executableName, 
    executableArguments); 
final Process shell = p.start(); 
InputStream shellIn = shell.getInputStream(); 
int shellExitStatus = shell.exitValue(); 

नोट: उबंटू खोल में सी निष्पादन योग्य चल रहा है बिल्कुल कोई त्रुटि नहीं देता है (यानी बाहर निकलें मूल्य 0)। लेकिन, जावा में एक ही आदेश कर बाहर निकलने के मूल्य 139.

+2

13 9 एक _Segmentation fault_ है। इसका मतलब है कि आपका _c-app_ स्मृति तक पहुंच रहा है, इसे एक्सेस नहीं करना चाहिए। – npe

+0

[यह] (http://stackoverflow.com/a/4842719/828625) आपके प्रश्न का उत्तर मुझे विश्वास है। –

+1

मिला [यह] (http://tldp.org/LDP/abs/html/exitcodes.html) भी, लेकिन मुझे नहीं पता कि यह आपके लिए कितना महत्वपूर्ण है। –

उत्तर

4

प्रणाली (विभाजन गलती के मामले में) की तरह आपके आवेदन को मारता है तो देता है यह 128 + सिग्नल के लिए बाहर निकलें कोड सेट - संकेत मूल्यों के लिए linux signal(7) manpage देखना ।

इसके अलावा, लिनक्स के लिए, वहाँ कई डिफ़ॉल्ट से बाहर निकलें sysexits.h हेडर फाइल में परिभाषित कोड होते हैं और इसी प्रोग्रामर उन स्थिरांक का उपयोग करने के बजाय मैन्युअल रूप से खुद मान निर्धारित करने की सलाह देते हैं। exit(3) manpage से:

बीएसडी ने निकास कोड को मानकीकृत करने का प्रयास किया है; फ़ाइल <sysexits.h> देखें।

आप उदाहरण here के लिए फ़ाइल पा सकते हैं, और मूल्यों शामिल हैं:

#define EX_OK   0 /* successful termination */ 

#define EX__BASE  64 /* base value for error messages */ 

#define EX_USAGE  64 /* command line usage error */ 
#define EX_DATAERR  65 /* data format error */ 
#define EX_NOINPUT  66 /* cannot open input */ 
#define EX_NOUSER  67 /* addressee unknown */ 
#define EX_NOHOST  68 /* host name unknown */ 
#define EX_UNAVAILABLE 69 /* service unavailable */ 
#define EX_SOFTWARE  70 /* internal software error */ 
#define EX_OSERR  71 /* system error (e.g., can't fork) */ 
#define EX_OSFILE  72 /* critical OS file missing */ 
#define EX_CANTCREAT 73 /* can't create (user) output file */ 
#define EX_IOERR  74 /* input/output error */ 
#define EX_TEMPFAIL  75 /* temp failure; user is invited to retry */ 
#define EX_PROTOCOL  76 /* remote error in protocol */ 
#define EX_NOPERM  77 /* permission denied */ 
#define EX_CONFIG  78 /* configuration error */ 

#define EX__MAX   78 /* maximum listed value */ 

हालांकि, उन्हें प्रयोग अनिवार्य नहीं है, और आप इसे मनचाहे मान का उपयोग करने के लिए स्वतंत्र हैं।

सामान्य उत्तर यह है - यदि आपका एप्लिकेशन शानदार तरीके से विफल रहता है (यानी यह त्रुटि को निष्पादित करने में सक्षम है), तो यह स्वयं से बाहर निकलने वाला कोड सेट करता है। यदि सिस्टम द्वारा एप्लिकेशन मारे गए हैं, तो यह सिस्टम है जो निकास कोड सेट करता है।

आप कुछ अतिरिक्त जानकारी के लिए this thread भी देख सकते हैं।