2015-06-28 26 views
7

Ý nghĩa chung của mã thoát 11 trong C là gì? Tôi đã nhìn xung quanh và không thể tìm thấy một câu trả lời dứt khoát vì vậy tôi nghĩ rằng tôi sẽ yêu cầu ở đây. Nó xuất hiện khi tôi cố gắng thêm một phần tử vào một vectơ.Ý nghĩa của mã số 11 trong C?

+2

Bạn có chắc chắn là "mã thoát" chứ không phải * tín hiệu 11 * không? –

+1

Có lẽ bạn đang trộn mã thoát và mã trả lại hoặc thậm chí tín hiệu Kerrek đã đề cập. Hiển thị mã nguồn gây ra sự cố. – Marged

+0

Nền tảng nào? Linux, Windows hay nói chung? –

Trả lời

0

Không có tiêu chuẩn nào xác định mã thoát nào mà ứng dụng phải đặt trong một số trường hợp nhất định. Nó là hoàn toàn lên đến các lập trình viên mà xuất cảnh mã đại diện cho lỗi hoặc thậm chí thành công!

Đôi khi người lập trình quyết định rằng bất kỳ giá trị nào khác với tín hiệu bằng không đều là lỗi và đôi khi giá trị này bằng với mã lỗi của hệ điều hành.

Trên mã thoát Windows 11 có thể được sử dụng do sự cố với tệp. Nếu bạn muốn mô tả mã lỗi này (cụ thể cho Windows và không nhất thiết là ứng dụng của bạn) hãy chạy net helpmsg 11.

3

Bạn không tìm thấy câu trả lời dứt khoát vì không có câu trả lời. Tùy thuộc vào tác giả của chương trình để quyết định mã số nào họ muốn sử dụng. Tiêu chuẩn C chỉ nói rằng exit(0) hoặc exit(EXIT_SUCCESS) cho biết rằng chương trình thành công và rằng exit(EXIT_FAILURE) cho biết lỗi thuộc loại nào đó. (Trả lại một giá trị từ main tương đương với việc gọi exit với giá trị đó.) Các hệ điều hành phổ biến nhất bao gồm Windows, Linux, OSX, v.v. sử dụng 0 cho thành công và giá trị từ 1 đến 255 để cho biết lỗi; vẫn lựa chọn giữa các mã lỗi là đến các nhà văn ứng dụng, giá trị 11 không phải là bất cứ điều gì đặc biệt.

Trong Linux và hầu hết các biến thể Unix khác, số signal cho biết số segmentation fault, dưới dạng remarked by Kerrek SB. Một lỗi phân đoạn xảy ra khi một chương trình làm cho một số loại truy cập bộ nhớ không hợp lệ, vì vậy đó là một kết quả chính đáng khi truy cập một mảng ngoài giới hạn hoặc lỗi trong số học con trỏ hoặc cố gắng truy cập con trỏ null hoặc lỗi liên quan đến con trỏ khác. Tín hiệu 11 không giống như mã thoát 11: khi một chương trình chết do tín hiệu, nó được đánh dấu là đã bị một tín hiệu giết chết, thay vì thoát ra bình thường. Unix shell báo cáo tín hiệu bằng cách báo cáo một mã thoát là số tín hiệu cộng với 128, do đó 139 cho một lỗi phân đoạn.

3

Các câu trả lời khác đã bỏ lỡ sự mơ hồ có thể xảy ra trong cụm từ "mã thoát". Tôi nghi ngờ những gì bạn có nghĩa là bằng cách "mã thoát" là mã trạng thái lấy ra với gia đình wait của syscalls, như trong:

/* assume a child process has already been created */ 
int status; 
wait(&status); 
printf("exit code %d\n", status); 

Nếu bạn làm điều gì đó như thế bạn có thể rất sẽ thấy "exit đang 11" nếu quá trình con segfaults. Nếu quá trình con thực sự được gọi là exit(11), bạn có thể thấy "mã thoát 2816" thay thế.

Sẽ tốt hơn nếu bạn gọi những thứ đó là "mã chờ" hoặc "trạng thái chờ" thay vì "mã thoát", để tránh nhầm lẫn với giá trị được chuyển đến thoát. Mã chờ chứa một vài mẩu thông tin được đóng gói cùng nhau thành một số nguyên duy nhất. Thông thường, bạn không nên nhìn trực tiếp vào số nguyên (như tôi đã làm ở trên trong đó printf). Thay vào đó, bạn nên sử dụng các macro W* từ <sys/wait.h> để phân tích macro.

Bắt đầu với các macro WIF* để tìm hiểu xem loại điều gì đã xảy ra, sau đó sử dụng thông tin đó để quyết định các macro khác W* sử dụng để nhận chi tiết.

if(WIFEXITED(status)) { 
    /* The child process exited normally */ 
    printf("Exit value %d\n", WEXITSTATUS(status)); 
} else if(WIFSIGNALED(status)) { 
    /* The child process was killed by a signal. Note the use of strsignal 
    to make the output human-readable. */ 
    printf("Killed by %s\n", strsignal(WTERMSIG(status))); 
} else { 
    /* ... you might want to handle "stopped" or "continued" events here */ 
} 
Các vấn đề liên quan