Tại sao tôi gặp lỗi 255 khi quay lại -1


10

Tôi mới tham gia lập trình C ++ và tôi có một câu hỏi rất cơ bản. Tôi đã nhận thấy rằng khi tôi trở lại -1trong chương trình C ++ và sau đó kiểm tra trạng thái thoát, tôi nhận được 255. Tại sao vậy?

Mã này là cơ bản nhất:

int main()
    {
        return -1;
    }

Sau đó, sau khi chạy mã được biên dịch:

echo $?
255

Câu trả lời:


24

Bởi vì trong UNIX / POSIX, mã thoát của chương trình được xác định là giá trị 8 bit không dấu. Chuyển đổi -1 thành 8 bit không dấu cho 255.

Chỉnh sửa để thêm:

Để cung cấp thêm chi tiết: họ chờ * () các lệnh gọi hệ thống trong UNIX mã hóa kết quả của một quá trình thành một số nguyên 32 bit duy nhất. 32 bit của kết quả đó được chia nhỏ hơn nữa để cung cấp thông tin như liệu lõi có bị đổ lõi, thoát ra do tín hiệu (và cái nào), v.v. Trong số 32 bit đó, chỉ có 8 bit được dành cho mã thoát của quy trình và những cái đó được hiểu là một giá trị không dấu.

Mô hình fork / exec / Wait của UNIX / POSIX là một trong những tính năng được nhúng sâu nhất và lâu đời nhất của nó; nếu bạn đang thiết kế một hệ điều hành mới ngày hôm nay, bạn có thể làm điều gì đó khác biệt (ít nhất là sử dụng 64 bit :-)).

Mặt khác, thực tế mà nói có thực sự hữu ích khi có> 255 mã thoát? Tôi nghi ngờ điều đó. Nếu bạn thực sự muốn thứ gì đó mạnh mẽ hơn, tôi khuyên bạn nên chuyển sang "chuỗi thoát", thay vì mã thoát số với phạm vi rộng hơn.


Đẹp chỉnh sửa. Cảm ơn thông tin bổ sung đó.
George M

7

Để trích dẫn từ bashtrang người đàn ông trên TÌNH TRẠNG EXIT

Trạng thái thoát của lệnh đã thực thi là giá trị được trả về bởi lệnh gọi hệ thống Waitpid hoặc hàm tương đương. Các trạng thái thoát nằm trong khoảng từ 0 đến 255, tuy nhiên, như được giải thích bên dưới, trình bao có thể sử dụng các giá trị trên 125 đặc biệt. Các trạng thái thoát khỏi các nội trang shell và các lệnh ghép cũng bị giới hạn trong phạm vi này. Trong một số trường hợp nhất định, hệ vỏ sẽ sử dụng các giá trị đặc biệt để chỉ ra các chế độ thất bại cụ thể.

Vì vậy, nó giới hạn nó đến phạm vi đó, tôi thực sự ngạc nhiên như bạn.

Từ waitpid (2)trang người đàn ông:

WEXITSTATUS(status)

trả về trạng thái thoát của đứa trẻ Điều này bao gồm 8 bit có ý nghĩa nhất của đối số trạng thái mà đứa trẻ được chỉ định trong lệnh gọi để thoát (3) hoặc _exit (2) hoặc làm đối số cho câu lệnh return trong main (). Macro này chỉ nên được sử dụng nếu WIFEXITED trả về đúng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.