2012-11-21 17 views
13

bar()foo() numaralı telefonu aramak istiyorum, bar() bazı global değişkenlerin değerlerini değiştirecektir (bu benim istediğim şey), ancak bu arada bazı çıktılar üretiyorum (herhangi bir çıktı istemiyorum);C - Bir alt fonksiyonun çıktısını nasıl önleyebilirim?

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

Ben bar() 'ın çıkışını bastırmak için ne yapabilirim?

cevap

14

stdout genel değişkenini bar();'dan önce kaydedebilir, ardından /dev/null olarak ayarlayabilir ve geri yükleyebilirsiniz. Kod örneği;

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

İşletim sistemi X'de test edildi, Windows hakkında emin değil.

DÜZENLEME: Sen Windows üzerinde nul ile /dev/null yerini alabilir. Windows altında çalışan fdopen() ve dup()'a gelince, bunlar benim man sayfalarına göre POSIX.1 standardının bir parçasıdır, ancak test etmedim.

DÜZENLEME 2: çözüm Windows için işe yaramazsa, Yorum önerilen olarak, this SO answer başka öneri var.

DÜZENLEME 3: Bunu yapmak için standart, uyumlu ve platformlar arası bir yol daha uzundır. basması stdout'u geçmeden önce basılmış (1) şey gerçekten ekrana yazdırılır emin olmak için gereklidir ve oldu (2) hiçbir şey vardır

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

(kod adı geçen SO soru uyarlanan ve _dup için Microsoft'un belgeler) stdout'u konsola (veya boruya) geri çevirmeden önce yazdırılır.

+1

Unix tabanlı sistemler (Linux, Mac OS X) altında çalışılabilir. Pencereler dünyasında "/ dev/null" gibi dosya yollarının bulunması mümkün olmadığından Windows altında çalışmaz. –

+0

"/ dev/null" ın kolay kısım olduğuna inanıyorum. Düzenlememe bak. – user1071136

+0

“Fdopen” çağrısında yaptığınız gibi stdout'a atanabilir mi? Standart, stdout'un bir "l-değeri" olması gerektiğini belirtir mi? Bu şekilde daha iyi olurdu - http://stackoverflow.com/a/7664951/922712 – user93353

İlgili konular