2012-06-20 23 views
5

Tôi đang sử dụng Process qua ProcessBuilder để chạy tệp thi hành được thực hiện trong mã C. Tôi đang bắt các Process.exitValue() để phản ứng trên giá trị thoát này. Tôi nhận thấy không phải tất cả các giá trị thoát là từ thực thi. Ví dụ, tôi nhận được một giá trị xuất cảnh của 139 và hư không trong mã C của tôi Tôi đang trở về một giá trị xuất cảnh của 139.Ý nghĩa của các giá trị từ Java Process.exitValue() là gì?

Tôi đang cố gắng tìm tổng quan về giá trị thoát, nhưng tôi không thể tìm thấy điều này, và bây giờ tôi tìm thấy giá trị thoát có thể phụ thuộc vào hệ điều hành. (Tôi đang sử dụng Ubuntu bằng cách này).

Dường như giá trị thoát duy nhất để đảm bảo là 0 khi mọi thứ diễn ra đúng. Có thông số kỹ thuật về giá trị thoát không? Tôi có thể chắc chắn rằng một phạm vi nhất định có thể được sử dụng chỉ cho chương trình của riêng tôi? Các mã thoát được dành riêng cho hệ điều hành.

Tôi phát hiện ra rằng 139 có thể là lỗi bộ nhớ trong mã C. Tôi muốn thoát khỏi cái có thể. Tôi không thể nhận được bất kỳ khái quát về giá trị xuất cảnh (ví dụ 139 = .....)

Đây là mã đơn giản bằng cách này:

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

Lưu ý: Chạy C thực thi trong vỏ Ubuntu không có lỗi gì cả (ví dụ: giá trị thoát 0). Nhưng, làm lệnh tương tự trong Java cho giá trị xuất cảnh 139.

+2

139 là lỗi _Segmentation_. Nó có nghĩa là _c-app_ của bạn đang truy cập bộ nhớ mà nó không truy cập được. – npe

+0

[This] (http://stackoverflow.com/a/4842719/828625) trả lời câu hỏi của bạn tôi tin. –

+1

Tìm thấy [this] (http://tldp.org/LDP/abs/html/exitcodes.html), nhưng tôi không biết nó có ý nghĩa như thế nào đối với bạn. –

Trả lời

4

Nếu hệ thống giết ứng dụng của bạn (như trong trường hợp của Segmentation lỗi) nó đặt mã thoát đến 128 + SIGNAL - xem linux signal(7) manpage cho các giá trị tín hiệu . Ngoài ra, đối với Linux, có một số mã thoát mặc định được xác định trong tệp tiêu đề sysexits.h và khuyên người lập trình nên sử dụng các hằng số đó thay vì tự xác định các giá trị của chính nó. Từ exit(3) manpage:

BSD đã cố gắng chuẩn hóa mã thoát; xem tập tin <sysexits.h>.

Bạn có thể tìm thấy các tập tin ví dụ here, và các giá trị bao gồm có:

#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 */ 

Tuy nhiên, việc sử dụng chúng là không bắt buộc, và bạn có thể tự do sử dụng bất kỳ giá trị mà bạn muốn.

Câu trả lời chung là - nếu ứng dụng của bạn không thành công (nghĩa là ứng dụng có thể xử lý lỗi khi thực hiện kết thúc), sau đó nó tự đặt mã thoát. Nếu ứng dụng bị hệ thống giết chết, đó là hệ thống đặt mã thoát.

Bạn cũng có thể xem this thread để biết thêm thông tin.

Các vấn đề liên quan