2012-11-21 9 views
13

foo() में bar() पर कॉल करना चाहते हैं, bar() कुछ वैश्विक चर के मूल्यों को बदल देगा (यह वही है जो मैं चाहता हूं), लेकिन इस बीच कुछ आउटपुट उत्पन्न करें (मुझे कोई आउटपुट नहीं चाहिए);सी - उप फ़ंक्शन के आउटपुट को दबाने के लिए कैसे?

void foo() 
{ 
    //I have tried: 
    //system("1>&/dev/null") and of course this won't work 
    bar(); 
} 

क्या मैं bar() के उत्पादन को दबाने के लिए कर सकते हैं?

उत्तर

14

आप वैश्विक चर stdoutbar(); से पहले सहेज सकते हैं, फिर इसे /dev/null पर सेट करें, फिर इसे पुनर्स्थापित करें। कोड उदाहरण;

#include <stdio.h> 

int main() { 
    int old_stdout = dup(1); 

    freopen ("/dev/null", "w", stdout); // or "nul" instead of "/dev/null" 
    printf("asd1"); 
    fclose(stdout); 

    stdout = fdopen(old_stdout, "w"); 
    printf("asd2"); 
    return 0; 
} 

ओएस एक्स पर परीक्षण किया गया, विंडोज के बारे में निश्चित नहीं है।

संपादित करें: आप /dev/null को nul विंडोज़ पर प्रतिस्थापित कर सकते हैं। fdopen() और dup() विंडोज के तहत काम करने के लिए - वे मेरे man पृष्ठों के अनुसार POSIX.1 मानक का हिस्सा हैं, लेकिन मैंने इसका परीक्षण नहीं किया है।

संपादित करें 2: टिप्पणियों में सुझाव दिया गया है कि यदि समाधान विंडोज के लिए काम नहीं करता है, तो this SO answer में एक और सुझाव है।

संपादित करें 3: एक लंबा, हालांकि मानक अनुपालन और ऐसा करने के लिए क्रॉस-प्लेटफ़ॉर्म तरीका निम्नानुसार है। (कोड का उल्लेख किया तो सवाल से अनुकूलित, और _dup के लिए माइक्रोसॉफ्ट के प्रलेखन)

#include <stdio.h> 

#ifdef _WIN32 
#include <io.h> 
char * const nulFileName = "NUL"; 
#define CROSS_DUP(fd) _dup(fd) 
#define CROSS_DUP2(fd, newfd) _dup2(fd, newfd) 
#else 
#include <unistd.h> 
char * const nulFileName = "/dev/null"; 
#define CROSS_DUP(fd) dup(fd) 
#define CROSS_DUP2(fd, newfd) dup2(fd, newfd) 
#endif 

int main() { 
    int stdoutBackupFd; 
    FILE *nullOut; 
    /* duplicate stdout */ 
    stdoutBackupFd = CROSS_DUP(STDOUT_FILENO); 

    fflush(stdout); 
    nullOut = fopen(nulFileName, "w"); 
    CROSS_DUP2(fileno(nullOut), STDOUT_FILENO); 

    printf("asd1\n"); 
    fflush(stdout); 
    fclose(nullOut); 

    // Restore stdout 
    CROSS_DUP2(stdoutBackupFd, STDOUT_FILENO); 
    close(stdoutBackupFd); 

    printf("asd2\n"); 

    return 0; 
} 

flushes सुनिश्चित करने के लिए आवश्यक हैं कि (1) कुछ भी stdout स्विच करने से पहले मुद्रित वास्तव में स्क्रीन पर छपा है, और (2) कुछ भी नहीं था कि कंसोल (या पाइप) पर वापस stdout स्विच करने से पहले मुद्रित मुद्रित है।

+1

यूनिक्स आधारित सिस्टम (लिनक्स, मैक ओएस एक्स) के तहत काम कर सकता है। विंडोज़ के तहत कभी काम नहीं करेगा, क्योंकि विंडोज़ वर्ल्ड फाइल पथ जैसे "/ dev/null" में संभव नहीं है। –

+0

मेरा मानना ​​है कि '/ dev/null' आसान हिस्सा है। मेरा संपादन देखें। – user1071136

+0

क्या 'stdout' को' fdopen' कॉल में करने के तरीके को असाइन किया जा सकता है? क्या मानक निर्दिष्ट करता है कि stdout को 'एल-वैल्यू' होना चाहिए? इस तरह से ऐसा करना बेहतर होगा - http://stackoverflow.com/a/7664951/922712 – user93353

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