2011-01-28 31 views

Trả lời

47

Trên hệ thống POSIX, bạn có thể làm điều đó như sau:

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); 

gì bạn muốn là không thể trong tính tổng quát hơn nữa.

Bất kỳ giải pháp nào sử dụng freopen đều sai, vì nó không cho phép bạn khôi phục bản gốc stdout. Bất kỳ giải pháp nào bằng cách gán cho stdout đều sai, vì stdout không phải là một lvalue (đó là macro mở rộng thành biểu thức kiểu FILE *).

+0

Không sử dụng dup2. Sử dụng gần (mới) và sau đó dup (1); dup() đảm bảo bạn sẽ nhận được bộ mô tả chính xác. 'Nếu newfd được mở, bất kỳ lỗi nào đã được báo cáo ở thời điểm close() sẽ bị mất. Một lập trình viên cẩn thận sẽ không sử dụng dup2 mà không đóng newfd trước tiên. ' –

+9

@MoraruLilian: Tôi đã sử dụng' dup2' rất cố ý. Nhận xét của bạn có các đối số trộn lẫn với mã của tôi, vì vậy tôi không thể chắc chắn điểm của bạn là gì, nhưng bất kỳ giải pháp nào không có 'dup2' đều có ** điều kiện chạy đua nguy hiểm **. Điểm của 'dup2 (x, y)' là thay thế 'y' ** nguyên tử ** bằng một bản sao của' x'. –

Các vấn đề liên quan