2011-12-23 52 views
5

Tôi đang thử nghiệm chương trình nhỏ này dưới Linux:

// foo.c 
#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char* argv[]) 
{ 
    int n = system(argv[1]); 
    printf("%d\n", n); 
    return n; 
} 

Không có vấn đề gì được đưa vào dòng lệnh, một echo $? luôn in 0, ví dụ:

$ ./foo anything 
sh: anything: not found 
32512 
$ echo $? 
0 

Câu hỏi của tôi là: Tại sao không $? có cùng giá trị với n? Tôi cũng đã thử nghiệm chương trình theo Win32 và echo %errorlevel% cho cùng một giá trị như n. Cảm ơn!

+0

Và có thể bạn chỉ sao chép hành vi khi 'hệ thống()' tham gia? (Giá trị âm được trả về, phải không? Đây có phải là định nghĩa trong Linux không?) –

+0

Tôi chỉ thấy hành vi này với 'system()'. Nếu tôi thực thi './Anything' theo sau là' echo $? ', Đầu ra sẽ là 127. – wdscxsj

Trả lời

6

Nếu bạn in n trong bát phân hoặc hex, bạn sẽ khám phá ra rằng byte thấp của nó luôn luôn 0.

là Nếu bạn return WEXITSTATUS(n);, chương trình của bạn sẽ thoát ra với tình trạng bạn đang mong đợi.

Đọc man systemman wait cẩn thận và bạn sẽ hiểu.

+0

Bạn cũng có thể chuyển n sang exit(); I E. 'exit (n);' –

+0

Cảm ơn bạn! Bây giờ tôi hiểu nó. – wdscxsj

+1

@MarkTurner Không, bạn không thể. 'return n;' từ 'main()' sẽ dẫn đến 'exit (n)' (gần như) ngay sau khi 'main' trả về. Và * that * vẫn sẽ dẫn đến '$?' Là '0'. –

2

8 bit Chỉ dưới của giá trị trả về được công nhận là trạng thái thoát, bởi vì trạng thái thoát được tính bằng cách WEXITSTATUS vĩ mô, xem SUSv4

+0

Tôi nghĩ rằng bạn có nghĩa là bit 8 ~ 15? – wdscxsj

+0

Điều gì khiến bạn nghĩ vậy? – wRAR

+0

Xin lỗi, tôi đã sai. Cảm ơn. – wdscxsj

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