2013-01-04 26 views
6

Ứng dụng gốc tôi đã viết sử dụng biến số tên /proc/PID/status. Tuy nhiên, có vẻ như biến tên trong tệp trạng thái chưa hoàn thành. Ví dụ, khi thử nghiệm tôi đã mở máy tính Android và tra cứu PID từ PS và đi đến thư mục /proc/PID tương ứng. Sau đó, tôi mở tệp trạng thái để xemTại sao tên của quy trình trong/proc/PID/trạng thái không khớp với tên gói hoặc lệnh ps

Name: oid.calculator 

Lệnh PS hiển thị com.android.calculator. packages.xml hiển thị com.android.calculator. Tôi đã thử nghiệm trên một số điện thoại khác (Razr Maxx chạy 4.0.4, Google Nexus chạy cùng một phiên bản hệ điều hành) và nhận thấy hành vi tương tự.

Trả lời

11

Đây là tính năng hạt nhân của Linux: có hai tên khác nhau cho quy trình.

  • Một trong những tên là thành phần cuối cùng của đường dẫn đến tệp thực thi, ví dụ: native_executable nếu đơn đăng ký của bạn nằm ở số /data/apps/com.example.hello/native_executable. Đây là tên xuất hiện trong trường Name của /proc/PID/status. Hạt nhân cắt ngắn nó thành 15 ký tự, vì vậy trong trường hợp này nó chứa native_executab.
  • Tên khác được chuyển bởi chương trình gọi ứng dụng là tham số dòng lệnh # 0 (argv[0] trong C, args[0] bằng Java). Đây là tên xuất hiện ở đầu số /proc/PID/cmdline và hiển thị ps.
  • Đường dẫn đến tệp thực thi cũng là mục tiêu của liên kết tượng trưng /proc/PID/exe.

Theo quy ước, khi chương trình bắt đầu chương trình khác, nó nên sử dụng tên của tệp thi hành làm tham số dòng lệnh 0, nhưng có thể chọn cách khác. Trường Name của /proc/PID/status luôn được đặt thành tên (cắt ngắn) của tệp thực thi bởi hạt nhân.

Đây là tính năng chung của Linux - xem thêm Can I use standard tools to get the full name of a process, when its name has embedded spaces? trên Ask Ubuntu.

Bản thân ứng dụng có thể thay đổi cả hai tên sau đó (mặc dù có những hạn chế về độ dài). Dalvik sử dụng khả năng này để phân biệt giữa các ứng dụng: tất cả các ứng dụng đều xuất phát từ cùng một tệp thực thi gốc /sytem/bin/app_process; thay vì để tất cả chúng được gọi là app_process, VM sẽ thay đổi cả hai tên thành tên gói ứng dụng. Tên trong /proc/PID/status được giới hạn trong 15 ký tự, đó là lý do tại sao nó bị cắt ngắn. Bạn có thể lấy tên dài hơn từ /proc/PID/cmdline (đọc đến byte null đầu tiên).

+0

Hoàn hảo cảm ơn bạn! – predhme

+0

Lý do để cắt bớt Tên thành 15 ký tự là gì? (TASK_COMM_LEN trên 'man proc'). Có vẻ như một giới hạn khá thấp. –

+1

@PabloBianchi Nó được cắt ngắn để giữ cho cấu trúc dữ liệu không đổi kích thước, điều quan trọng trong hạt nhân. Tôi không biết tại sao kích thước nhỏ. – Gilles

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