2010-09-17 40 views
20

Tôi đang cố gắng trả về một giá trị lớn hơn như 1000 từ hàm chính của tôi, nhưng khi tôi nhập echo $?, nó sẽ hiển thị 0.Tại sao tôi không thể trả về các giá trị lớn hơn từ chức năng chính?

Nếu tôi trả lại giá trị nhỏ hơn như 100, nó sẽ hiển thị giá trị chính xác.

Mã của tôi:

int main(void) 
{ 
    return 1000; 
} 

Có bất kỳ hạn chế trên các giá trị mà chúng tôi có thể trở lại?

+0

Tôi nhận được ** 232 ** cho 'return 1000; 'và ** 233 ** cho' return 1001;' – Lazer

+5

** 1000% 256 = 232 ** – Lazer

Trả lời

22

Có hai khái niệm có liên quan ở đây: trạng thái thoát C và mã trả lại bash. Cả hai đều bao gồm phạm vi 0-255, nhưng bash sử dụng số trên 126 cho mục đích riêng của nó, do đó, nó sẽ gây nhầm lẫn để trả lại những người từ chương trình của bạn.

Để có các mã trạng thái thoát giới hạn an toàn đến 0-127, vì đó là mã di động nhiều nhất, ít nhất điều đó được ngụ ý bởi http://docs.python.org/library/sys.html#sys.exit.

Trạng thái thoát C được đưa vào bash $? biến sau khi thực hiện, nhưng bash sử dụng 127 để chỉ ra 'lệnh không tìm thấy', do đó bạn có thể muốn tránh điều đó. Bash reference page.

Bash cũng sử dụng 128-255 tín hiệu - chúng cho biết quá trình đã bị giết bằng tín hiệu: exit code = 128 + signal number. Vì vậy, bạn có thể có được để có được đi với việc sử dụng số gần 255 vì nó không chắc rằng số tín hiệu sẽ đi mà cao.

Ngoài những hướng dẫn chung, có nhiều cố gắng xác định những con số khác nhau có nghĩa là gì: http://tldp.org/LDP/abs/html/exitcodes.html.

Vì vậy, bạn muốn trả về một số nguyên tùy ý từ chương trình của mình, có lẽ tốt nhất bạn nên in nó thành stdout và chụp nó bằng VALUE=$(program) từ tập lệnh bash của bạn.

+0

Tôi tin phạm vi là 0-255 (tức là phạm vi 'uint8_t') trên * hệ thống NIX - không quen thuộc với bất kỳ hệ thống nào có giá trị tối đa là 127 (có nghĩa là kiểu trả về tương đương với' int8_t', nhưng điều đó cũng ngụ ý giới hạn dưới của -128.) –

+0

+1 Cảm ơn lời giải thích:) – Searock

+0

Bên cạnh việc nói phạm vi không đúng (như @ Jonathan ghi chú), bạn cũng có vẻ nhầm lẫn trạng thái thoát chương trình (như được báo cáo bởi 'waitpid (2)') và trạng thái thoát lệnh shell (như được báo cáo bởi '$?'). "128-255 được sử dụng cho tín hiệu" chỉ áp dụng cho tín hiệu sau. –

3

Giá trị trả lại là main (tức là trạng thái thoát của ứng dụng) được giới hạn trong phạm vi [0, 255] trên * NIX. 1000 nằm ngoài phạm vi và hệ điều hành xử lý nó là 0, có lẽ.

+2

Không, ít nhất là bash, trạng thái thoát lớn hơn 255 trả về giá trị modulo 256. 1000 sẽ trả về 232 –

+0

Đó là những gì tôi giả định, dựa trên cách xử lý các số, nhưng OP cho biết anh ta nhận được 0 là kết quả của mình. –

1

Trong vùng đất Unix giá trị trả lại là main bị giới hạn bởi vì exit giới hạn phạm vi của byte 8 bit.

Trong Windows có một giá trị, STILL_ACTIVE với giá trị 259, tốt nhất nên tránh làm mã thoát khỏi quy trình.

Ngoài ra, trong Windows, bạn có thể trả về mã 32 bit chẳng hạn như HRESULT và thường được thực hiện.

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