2011-01-28 13 views
23

मेरे सी प्रोग्राम के भीतर मैं अस्थायी रूप से STDOUT को "/ dev/null" (उदाहरण के लिए) पर रीडायरेक्ट करना चाहता हूं। फिर "/ dev/null" पर लिखने के बाद मैं STDOUT को पुनर्स्थापित करना चाहता हूं। मैं इसे कैसे प्रबंधित करूं?मैं सी प्रोग्राम में किसी फ़ाइल में stdout को अस्थायी रीडायरेक्ट कैसे कर सकता हूं?

उत्तर

47

POSIX सिस्टम पर, आप इसे इस रूप में कर सकते हैं:

int bak, new; 
fflush(stdout); 
bak = dup(1); 
new = open("/dev/null", O_WRONLY); 
dup2(new, 1); 
close(new); 
/* your code here ... */ 
fflush(stdout); 
dup2(bak, 1); 
close(bak); 

क्या आप चाहते हैं आगे व्यापकता में संभव नहीं है।

freopen का उपयोग कर कोई भी समाधान गलत है, क्योंकि यह आपको मूल stdout को पुनर्स्थापित करने की अनुमति नहीं देता है। stdout पर असाइनमेंट द्वारा कोई भी समाधान गलत है, क्योंकि stdout एक लवल्यू नहीं है (यह एक मैक्रो है जो FILE * प्रकार की अभिव्यक्ति तक फैला हुआ है)।

+0

डुप्ली 2 का उपयोग न करें। नज़दीक (नया) और फिर डुप्लिकेट (1) का प्रयोग करें; डुप्लिकेट() सुनिश्चित करता है कि आपको सही वर्णनकर्ता मिल जाएगा। 'अगर newfd खुला था, तो किसी भी त्रुटि जो करीब() समय पर रिपोर्ट की गई थी, खो जाती है। एक सावधान प्रोग्रामर पहले नएएफडी बंद किए बिना डुप्ली 2 का उपयोग नहीं करेगा। ' –

+9

@ मोरारुएलियन: मैंने बहुत ही जानबूझकर' dup2' का उपयोग किया। आपकी टिप्पणी में मेरे कोड बनाम सभी मिश्रित तर्क हैं, इसलिए मुझे यकीन नहीं है कि आपका बिंदु क्या है, लेकिन 'dup2' के बिना किसी भी समाधान में ** खतरनाक दौड़ की स्थिति ** है। 'Dup2 (x, y) 'का बिंदु' y' ** परमाणु रूप से ** x' की एक प्रति के साथ प्रतिस्थापित करना है। –

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

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