2009-06-15 64 views
5

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

17

Sử dụng freopen để chuyển hướng đến dev/null:

freopen("/dev/null", "w", stderr); 
+0

Đánh bại tôi sau 10 giây! –

0

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.

+0

equiv: NUL trên cửa sổ –

0

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

+4

Đó là những gì anh ta đặc biệt không yêu cầu. –

+0

Tôi không rõ ràng về ý nghĩa của từ "kịch bản lệnh chuyển hướng". – Ambuoroko

14

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

+0

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ờ. –

5

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); 
Các vấn đề liên quan