2011-01-21 28 views
5

Tôi đang đọc từ/proc/pid/task/stat để theo dõi việc sử dụng CPU trong một chuỗi. fopen trên/proc/pic/task/stat bỏ qua một chuỗi từ luồng sscanf trên chuỗiLàm mới bộ đệm luồng khi đọc/proc

Tôi đang gặp sự cố khi tải bộ đệm luồng để cập nhật. Nếu tôi fget 1024 ký tự nếu regreshes nhưng nếu tôi fget 128 ký tự thì nó không bao giờ cập nhật và tôi luôn nhận được cùng một số liệu thống kê. Tôi tua lại luồng trước khi đọc và đã thử fsync.

Tôi làm điều này rất thường xuyên vì vậy tôi không muốn mở lại để nộp mỗi lần. Cách thích hợp để thực hiện việc này là gì?

Trả lời

4

Không phải mọi chương trình đều hưởng lợi từ việc sử dụng I/O đệm.

Trong trường hợp của bạn, tôi nghĩ tôi sẽ chỉ sử dụng read(2) . Bằng cách này, bạn:

  • loại bỏ tất cả đệm cũ vấn đề
  • lẽ chạy nhanh hơn thông qua việc loại bỏ các đệm đôi
  • lẽ sử dụng ít bộ nhớ
  • chắc chắn đơn giản hóa việc thực hiện

Đối với một trường hợp như bạn mô tả, hiệu quả đạt được có thể không quan trọng trên ngày hôm nay của CPU mạnh mẽ đáng kể. Nhưng tôi sẽ chỉ ra rằng các chương trình như cp(2) và các trình chuyển dữ liệu hạng nặng khác không sử dụng các gói I/O đệm.


1. Đó là, open(2), read(2), lseek(2), và close(2). 2. Và có lẽ để chặn một đối số, về các câu hỏi liên quan đến người này thường đưa ra gợi ý "hữu ích" dọc theo các dòng fflush(stdin), và sau đó một người khác đến để chỉ ra chính xác rằng fflush() được xác định bởi C99 trên luồng đầu ra chỉ, và thường là không khôn ngoan để phụ thuộc vào hành vi cụ thể của việc triển khai thực hiện.

+1

Tôi sẽ thử chuyển từ fopen sang mở ngày mai. Hy vọng rằng sẽ làm việc tốt hơn. –

+0

Hah, hoạt động như một nét duyên dáng ... cảm ơn! –

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