Tôi đã viết một chương trình cho Linux bằng cách sử dụng libxml2 để phân tích cú pháp html. Mặc dù nó thực hiện công việc của mình, trình phân tích cú pháp html viết rất nhiều lỗi khác nhau cho stderr. Có thể vô hiệu hóa stderr ở tất cả (hoặc chuyển hướng nó đến/dev/null trong khi không phải chạy nó với một kịch bản lệnh chuyển hướng)? Tôi có thể sống với việc phải viết các lỗi của riêng mình để stdout, tôi chỉ muốn loại bỏ các lỗi này.Có thể tắt stderr trong C++ không?
Trả lời
Sử dụng freopen để chuyển hướng đến dev/null:
freopen("/dev/null", "w", stderr);
Xem trang hướng dẫn sử dụng cho chức năng pipe(2)
. Vượt qua nó STDERR và một xử lý để/dev/null, và nó sẽ làm việc.
equiv: NUL trên cửa sổ –
Bạn có thể chuyển hướng stderr (trong bash, dù sao đi nữa) từ dòng lệnh như vậy:
./myProgram 2>/dev/null
Đó là những gì anh ta đặc biệt không yêu cầu. –
Tôi không rõ ràng về ý nghĩa của từ "kịch bản lệnh chuyển hướng". – Ambuoroko
freopen()
ing stderr
đã được đề cập, giải quyết câu hỏi cụ thể của bạn. Nhưng kể từ khi bạn đang làm việc với libxml2, bạn có thể muốn kiểm soát hạt mịn hơn của các thông báo lỗi và không chỉ chuyển hướng tất cả các thông điệp stderr categorically. Các thông báo lỗi có ở đó vì một lý do, bạn biết đấy. Xem libxml2 documentation về cách sử dụng trình xử lý lỗi với libxml2. Một điểm khởi đầu tốt là xmlSetGenericErrorFunc()
Cảm ơn tôi sẽ sử dụng nó trong tương lai, nhưng tôi cần một giải pháp nhanh chóng ngay bây giờ, vì vậy freopen sẽ làm ngay bây giờ. –
freopen (3) là một giải pháp theo định hướng C (không phải C++ như câu hỏi được yêu cầu), và nó chỉ là may mắn làm cho nó hoạt động. Nó không được chỉ định để làm việc. Nó chỉ hoạt động vì khi bộ mô tả tập tin 2 được đóng và/dev/null được mở, nó sẽ nhận được bộ mô tả tập tin 2. Trong môi trường đa luồng, điều này có thể thất bại. Bạn cũng không thể đảm bảo rằng việc thực hiện freopen (3) đầu tiên đóng luồng đã cho trước khi mở tệp mới. Tất cả điều này giả định rằng bạn không thể giả định rằng libxml2 sử dụng kiểu stdio kiểu C.
Một POSIX giải pháp này là sử dụng mở (2) và dup2 (2):
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
...
/* error checking elided for brevity */
int fd = ::open("/dev/null", O_WRONLY);
::dup2(fd, 2);
::close(fd);
- 1. c popen sẽ không bắt stderr
- 2. Tôi có thể tắt control-C được không?
- 3. Tôi có thể tắt ngoại lệ trong STL không?
- 4. Trong python, tôi có thể chuyển hướng đầu ra của chức năng in tới stderr không?
- 5. Có thể tắt cuộn trên listView không?
- 6. Java: Có thể tắt Ctrl-C trong ứng dụng bảng điều khiển Java không?
- 7. Khi nào nên sử dụng $ stderr vs STDERR trong Ruby?
- 8. Có thể tắt jsessionid trong servlet tomcat không?
- 9. Có thể tắt giới hạn khung trong libGDX không?
- 10. Có thể tắt Ctrl + F tìm trong trang không?
- 11. java stderr đi đâu?
- 12. Có thể tắt lối tắt 'shift + space' trong SQL Server Management Studio 2008 không?
- 13. Có thể không? GUI trong C#, ứng dụng trong C++
- 14. Tôi có thể tắt nút 'đóng' của biểu mẫu bằng C# không?
- 15. Tóm tắt constructor trong C#
- 16. Chuyển hướng stdout + stderr trên dịch vụ C# Windows
- 17. khởi chạy ứng dụng, chụp stdout và stderr bằng C++
- 18. Thiết kế lớp C# - tôi có thể sử dụng gì thay vì "tóm tắt tĩnh"? không
- 19. Chụp stdout/stderr với NDK
- 20. Windows C++: Làm thế nào tôi có thể chuyển hướng stderr cho các cuộc gọi đến fprintf?
- 21. Phủ định của -2147483648 không thể có trong C/C++?
- 22. Có thể hủy bỏ tắt máy trên Linux không?
- 23. phonegap localstorage có thể lưu sau khi tắt nguồn không?
- 24. Có thể tắt tự động hoàn tất không?
- 25. Bạn có thể thêm phím tắt ESC Key không?
- 26. Tôi có thể tắt âm thanh cuộn UIPickerView không?
- 27. Có thể tắt cảnh báo trình biên dịch C4503 không?
- 28. Có phiên bản viết tắt If-Then-Else trong C# (cond? A: b), trong VB.Net không?
- 29. Có thể khởi động dịch vụ bằng phím tắt không?
- 30. Có thể tắt tùy chọn đa dòng của textarea không?
Đánh bại tôi sau 10 giây! –