Một vài tháng trước, tôi viết một ứng dụng CGI cho Linux sử dụng popen()
để đọc đầu ra của lệnh, và sau đó tôi đóng ống với fclose()
.sử dụng fclose để ống popen là một lỗi nghiêm trọng?
Bây giờ, tôi đọc cho các đường ống gần là cần sử dụng pclose()
.
Sổ tay nói:
Giá trị trả về từ
popen()
là một bình thường tiêu chuẩn I/O hoạt động trong tất cả các khía cạnh tiết kiệm mà nó phải được đóng lại vớipclose()
hơnfclose(3)
.
Mã của tôi là như thế này:
if ((NULL != (f = popen(command.value, "r")))) {
//do something
fclose(f);
}
Câu hỏi của tôi là:
Sai lầm của tôi có một mối quan tâm an ninh? Chương trình hiện đang được sản xuất. Trong các thử nghiệm nó không làm bất cứ vấn đề gì. Thực sự cần thiết, hãy vá nó bằng cách sử dụng pclose()
thay vì fclose()
? Lưu ý: Tôi chỉ mở PIPE một lần trong chương trình.
Hôm nay, ở nhà địa phương của tôi, tôi làm một số thử nghiệm và fclose()
và pclose()
không trả lại EOF cho biết lỗi.
Bạn có hành vi Không xác định : Đọc ['pclose()' vs 'fclose()'?] (Http://cboard.cprogramming.com/cplusplus-programming/97147-pclose-vs-fclose.html): Hàm '_pclose' tìm kiếm ID tiến trình của bộ xử lý lệnh (CMD.EXE) bắt đầu bằng lệnh '_popen' liên quan, thực hiện lệnh gọi' _cwait' trên bộ xử lý lệnh mới và đóng luồng trên đường ống liên kết.' –
Có một số bài viết SO liên quan đến câu hỏi của bạn: 1. ['fclose ()/pclose() 'có thể chặn trên một số con trỏ tập tin] (http://stackoverflow.com/questions/1736983/fclose-pclose-may-block-on-some-file-pointers) và [Cách xử lý ống gần trong unix ? '(fclose() của pclose())'?] (http://stackoverflow.com/questions/5548364/how-close-pipe-handle-in-unix-fclose-of-pclose) –
cảm ơn, tôi sẽ sửa chữa bởi vì thực sự quan trọng. Bây giờ, tôi nhìn vào tác động. – carlos