2013-03-01 17 views
12

geri yükleyin:aynı dosyaya stdout ve stderr yeniden yönlendir ve ona iki dosyalara benim c programının stderr'e çıktısını ve çıkışı yönlendirme ve daha sonra özgün stdout ve stderr yeniden ediyorum

int sout = dup(fileno(stdout)); 
freopen("test.txt","w",stdout); 

int serr = dup(fileno(stderr)); 
freopen("test.txt","a",stderr); 

//some output.... 

dup2(sout,fileno(stdout)); 
close(sout); 

dup2(serr,fileno(stderr)); 
close(serr); 

kod axample var . Bu çalışıyor.

Ancak stdout ve stderr'i aynı dosyaya yeniden yönlendirmek istiyorum (ve daha sonra yeniden yükleyin) böylece çıktı, stderr ve stdout'u yeniden yönlendirmediğinizde konsol çıktısında sıralandığı şekilde sıralanır. Bunu nasıl yapabilirim?

Selamlar

sw

cevap

12

Yerine olduğu gibi stderr için dosyayı yeniden açmayı:

dup2(fileno(stdout), fileno(stderr)); 
: yaparak

freopen("test.txt","a",stderr); 

dosya tanıtıcı seviyesinde stdout yönlendirebilirsiniz

Not: stdout ve stderr hala bağımsız kullanıcı seviyesi tamponlarını kullanacak ve etkileşimli bir terminalde yönlendirilmediğinde, yıkama kuralları farklıdır. Bu, büyük olasılıkla yeniden yönlendirildiğinde farklı çıkış siparişlerinin ana sebebi olacaktır. this explanation of flushing modes ve setvbuf() için man sayfasına bakın.

İlgili konular