2011-11-19 37 views
5

Tôi có thể tạo bất kỳ ánh xạ tệp nào trong procfs để phản ánh trạng thái nội bộ của chương trình của tôi không?Trạng thái chương trình xuất sang procfs?

Ví dụ,

main.c: 

char *message; 

... 

Giả sử pid là 1200, là nó có thể tạo ra một thoáng tập tin/proc/1200/biến/tin nhắn, mà sẽ phản ánh biến thông điệp?

Tôi đoán tôi cần phải làm việc với các fs proc, vì có /proc/.../{net, fd, task, v.v.}, tôi nên bắt đầu ở đâu nếu tôi muốn thêm một biến/phần khác vào proc fs?

Trả lời

1

Bạn không thể trừ khi bạn đang viết mô-đun hạt nhân

4

Không có công cụ để thực hiện những gì bạn muốn thực hiện.

Có một số điều mà gần - gdb(1) biết làm thế nào để nội quan các chương trình đang chạy và các giá trị hiển thị của một số biến (không phải tất cả các biến tồn biên soạn - dù debug -g cờ giúp đỡ gdb(1) khám phá những gì tối ưu hóa có thể có được thực hiện cho chương trình của bạn).

Dự án FUSE làm cho các chương trình không gian người dùng có thể cung cấp hệ thống tệp cho các quy trình khác qua hạt nhân. Bạn có thể sử dụng FUSE trực tiếp để xuất các biến được lựa chọn từ chương trình của bạn hoặc bạn có thể thử một cái gì đó đầy tham vọng hơn và viết các công cụ để đóng gói các khả năng introspection của gdb(1) s với khả năng xuất bản của FUSE và cung cấp dịch vụ này cho thế giới.

Bạn cũng có thể xem xét sử dụng 9p từ bên trong các chương trình của mình - tương tự như FUSE, cho phép các chương trình cung cấp giao diện cho chức năng của chúng thông qua giao diện hệ thống tệp. (Bạn có thể thấy nó được sử dụng trong wmii window manager, nơi có thể kiểm soát được một số lượng đáng ngạc nhiên của trình quản lý cửa sổ thông qua giao diện hệ thống tệp, cho phép lập trình dễ dàng bằng bất kỳ ngôn ngữ nào bạn muốn.) Bạn có thể, một lần nữa, tích hợp điều này với nội tâm của gdb(1) khả năng cố gắng cung cấp điều này.

Tôi mong đợi một dự án như vậy xứng đáng với một dự án cao cấp hoặc dự án trường học tốt nghiệp - không phải điều gì đó sẽ được thực hiện nhanh chóng.

3

Nói chung bạn không thể làm điều đó ngay từ không gian người dùng. procfs là hạt nhân báo cáo trạng thái quá trình của nó cho bạn. Vì vậy, nếu bạn muốn làm một cái gì đó như thế này, bạn muốn

a) phải tạo mô-đun hạt nhân cho phép bạn liên lạc nội dung với nó b) kích hoạt truy xuất nội dung thông qua tín hiệu của một số loại.

Vì vậy, nếu bạn thực sự muốn thực hiện việc này. Tôi sẽ đề xuất đường dẫn sau:

1) Viết mô-đun hạt nhân có thể giao tiếp trạng thái chương trình. Hãy gọi nó là kpsmod cho cuộc thảo luận của chúng tôi.

2) Giao tiếp với không gian người dùng có giao tiếp với quy trình người dùng thông qua một số cơ chế (nói liên kết net) để bắt đầu một số quy trình đăng ký, đăng ký địa chỉ biến. Chương trình không gian người dùng cho mô-đun biết rằng nó quan tâm đến việc "xuất khẩu" chính nó ra trên một tín hiệu (nói SIGHUP hoặc SIGUSR1); cũng có thể lập trình được. Chuyển tên, địa chỉ và kích thước cần đọc (với thông tin loại nếu cần). Nếu biến nằm trên ngăn xếp, biến đó sẽ bị từ chối.Chỉ cho phép các ký hiệu có thể truy cập trên toàn cầu cho điều này (để đơn giản)

3) Bạn thậm chí có thể nghĩ về việc truy cập ngăn xếp ptrace cho quá trình tại thời điểm proc_read của biến cụ thể.

4) sau đó các mô-đun hạt nhân nên tạo một/proc/kpsmod // vars * cho mỗi biến và khi biến được đọc

5) vào đọc đổ nội dung bộ nhớ qua proc (có khả năng định dạng)

và thì đấy :-) bạn có hiệu quả mong muốn.

3

Thay vì sử dụng /proc, bạn có thể sử dụng ống được đặt tên.

Tạo một FIFO bằng cách sử dụng mkfifo và mở chương trình để viết. Hoặc trong một chuỗi chuyên dụng hoặc không đồng bộ, chương trình của bạn sẽ tạo văn bản khi ai đó chạy cat your-pipe trong trình bao. cat mở ống có tên để đọc, tất nhiên.

Điều này về cơ bản bắt chước giao diện cat /proc/...., nhưng thay vì có một mô-đun hạt nhân thực hiện tạo văn bản, bạn có một chương trình thực hiện nó.

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