C programım içinde STDOUT'u geçici olarak "/ dev/null" olarak yönlendirmek istiyorum (örneğin). Sonra "/ dev/null" yazdıktan sonra STDOUT geri yüklemek istiyorum. Bunu nasıl yönetirim? aşağıdaki gibiBir C programında stdout'u bir dosyaya nasıl geçici olarak yönlendirebilirim?
POSIX sistemlerinde
23
A
cevap
47
, bunu yapabilirsiniz: İstediğin başka genelliği mümkün değildir
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);
. stdout
numaralı belgeyi geri yüklemenize izin vermediğinden, freopen
kullanarak herhangi bir çözüm yanlıştır. stdout
, stdout
değeri bir değer değil (FILE *
türünde bir ifadeye genişleyen bir makro) olarak atama yoluyla stdout
için bir çözüm yanlıştır.
Dup2'yi kullanmayın. Yakın (yeni) ve sonra dup (1) kullanın; dup() doğru tanıtıcıyı elde etmenizi sağlar. 'Newfd açıksa, close() zamanında bildirilen hatalar kaybolur. Dikkatli bir programcı ilk önce newfd'yi kapatmadan dup2 kullanmaz. –
@MoraruLilian: Çok kasıtlı olarak dup2'yi kullandım. Yorumunuz benim kodumla karıştırılan tüm argümanlara sahip, bu yüzden ne demek istediğinizden emin olamıyorum, ancak dup2' içermeyen herhangi bir çözüm ** tehlikeli yarış koşullarına sahiptir **. Dup2 (x, y) 'nin anlamı, 'x' nin bir kopyası ile atomik olarak ** yi değiştirmektir. –