Trong chương trình C của tôi, tôi muốn tạm thời chuyển hướng STDOUT thành "/ dev/null" (ví dụ). Sau đó, sau khi ghi vào "/ dev/null" Tôi muốn khôi phục STDOUT. Làm thế nào để quản lý điều này?Làm cách nào để tạm thời chuyển hướng stdout sang tệp trong chương trình C?
23
A
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 *
).
Các vấn đề liên quan
- 1. Perl: Chuyển hướng STDOUT sang hai tệp
- 2. Làm cách nào để chuyển hướng STDOUT sang NSTextView?
- 3. Làm thế nào tôi có thể tạm thời dừng STDOUT trong một chương trình Perl?
- 4. Làm cách nào để chuyển hướng stdout sang tệp khi sử dụng subprocess.call trong python?
- 5. log4j chuyển hướng stdout sang DailyRollingFileAppender
- 6. Làm cách nào để ghi trực tiếp vào luồng StdOut của chương trình trong C#?
- 7. Chuyển hướng stdout và stderr sang ổ cắm cho chương trình shell được phân phối
- 8. Về stdout/stderr chuyển hướng
- 9. Chuyển hướng stdout sang logger bằng Python
- 10. Chuyển hướng stdout sang logcat trong Android NDK
- 11. Cách chuyển hướng STDOUT và STDERR sang biến số
- 12. Làm cách nào để chuyển hướng đầu ra tiêu chuẩn sang một tệp trong Perl?
- 13. Chuyển hướng đầu vào tạm thời trong Bash
- 14. Làm thế nào để chuyển hướng quá trình con stdout/stderr cho quá trình stdout/stderr chính trong Java?
- 15. Trả lại 307 Chuyển hướng tạm thời trong ASP.NET MVC
- 16. Làm cách nào để tạo tệp tạm thời với Cocoa?
- 17. Làm cách nào để chương trình Windows tạm thời thay đổi múi giờ của nó?
- 18. Làm cách nào để chuyển một chương trình Arduino sang .net để sử dụng trên Netduino?
- 19. Chuyển hướng stdout + stderr trên dịch vụ C# Windows
- 20. Làm cách nào để tạo tệp tạm thời để viết bằng C++ trên nền tảng Linux?
- 21. Làm thế nào để chuyển hướng stdout cho một tiến trình con?
- 22. Làm cách nào để mở tệp tạm thời VÀ nhận tên tệp của nó?
- 23. Chuyển hướng stdout thành "không có gì" trong python
- 24. Chuyển hướng cả cout và stdout thành chuỗi trong C++ để kiểm tra đơn vị
- 25. Chuyển hướng không đồng bộ stdout/stdin từ python được nhúng sang C++?
- 26. windows console chương trình stdout được đệm khi sử dụng chuyển hướng ống
- 27. Disable đệm trên chuyển hướng ống stdout (Win32 API, C++)
- 28. Sự cố khi chuyển hướng đầu ra chương trình C trong bash
- 29. Chuyển hướng stderr phụ tiến trình tới stdout
- 30. Tạm thời tắt tự động cập nhật theo chương trình
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. ' –
@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'. –