2011-12-23 18 views
5

मैं लिनक्स के तहत इस छोटे से कार्यक्रम का परीक्षण कर रहा हूँ:

// 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; 
} 

कोई फर्क नहीं पड़ता कमांड लाइन में खिलाया जाता है, एक echo $? हमेशा 0 प्रिंट, जैसे:

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

मेरा प्रश्न है: क्यों $?n के समान मूल्य नहीं लेते हैं? मैंने Win32 के तहत प्रोग्राम का भी परीक्षण किया है, और echo %errorlevel%n के समान मान देता है। धन्यवाद!

+0

देखने और आप केवल व्यवहार को पुनः सकता है जब 'प्रणाली()' शामिल है? (एक ऋणात्मक मूल्य वापस किया जा रहा है, है ना? क्या यह लिनक्स में परिभाषित है?) –

+0

मैंने केवल इस व्यवहार को 'सिस्टम() 'के साथ देखा है। अगर मैं 'echo $?' के बाद '।/Anything' निष्पादित करता हूं, तो आउटपुट 127 होगा। – wdscxsj

उत्तर

6

आप अष्टाधारी या हेक्स में n मुद्रित हैं, तो आप पता चल जाएगा कि यह कम बाइट हमेशा 0.

है आप return WEXITSTATUS(n);, अपने कार्यक्रम स्थिति आप उम्मीद कर रहे हैं के साथ बाहर निकलने देंगे।

man system और man wait ध्यान से पढ़ें, और आप समझेंगे।

+0

आप बाहर निकलने के लिए बस पास भी कर सकते हैं(); अर्थात। 'बाहर निकलें (एन);' –

+0

धन्यवाद! अब मैं इसे समझता हूँ। – wdscxsj

+1

@ मार्क टर्नर नहीं, आप नहीं कर सकते। 'मुख्य()' से 'वापसी एन; 'के परिणामस्वरूप' मुख्य 'रिटर्न के तुरंत बाद' बाहर निकलें (एन)' (लगभग) होगा। और * वह * अभी भी '0' 'होने के परिणामस्वरूप' 0' हो जाएगा। –

2

केवल कम वापसी मान के 8 बिट, बाहर निकलें स्थिति के रूप में पहचाने जाते हैं क्योंकि बाहर निकलने स्थिति WEXITSTATUS मैक्रो करके की जाती है, SUSv4

+0

मुझे लगता है कि आप बिट्स 8 ~ 15 मतलब है? – wdscxsj

+0

आपको क्या लगता है? – wRAR

+0

क्षमा करें, मैं गलत था। धन्यवाद। – wdscxsj

संबंधित मुद्दे