2012-09-05 30 views
6

Tôi đang ở trên OSX Mountain Lion và đang cố truy xuất tên của quy trình bằng cách sử dụng PID của nó.Nhận tên từ PID?

Sau đây là đoạn code tôi đang sử dụng:

pid_t pid = 10687; 
char pathBuffer [PROC_PIDPATHINFO_MAXSIZE] = ""; 
char nameBuffer [256] = ""; 

int sizeOfVal = sizeof(nameBuffer); 
proc_pidpath(pid, pathBuffer, sizeof(pathBuffer)); 
proc_name(pid, nameBuffer, sizeof(nameBuffer)); 

NSLog(@"Path: %s\n Name: %s\n", pathBuffer, nameBuffer); 

Đoạn mã trên có thể lấy tên đúng cách, tuy nhiên nó chỉ lấy 15 ký tự đầu tiên và "bỏ qua" phần còn lại. Lưu ý rằng đây không phải là vấn đề khi hiển thị tên nhưng với truy xuất. Vấn đề không phải là với phần còn lại của ứng dụng của tôi khi tôi đang thử nghiệm mã trên trong một ứng dụng độc lập. Cũng lưu ý rằng tôi đã thử thay đổi PID, nhưng bất kể PID nào tôi thử mã chỉ lấy 15 ký tự đầu tiên của tên. Khôi phục đường dẫn hoạt động hoàn hảo.

Có ai có bất kỳ ý tưởng nào về những gì tôi đang làm sai không?

+0

Như tôi đã nghiên cứu vấn đề này, tôi tìm thấy một số kỳ lạ hơn. Nếu chiều dài bộ đệm được chỉ định nhỏ hơn 32 byte, không có gì sẽ được đặt vào chuỗi, ngay cả khi tên ngắn (và sẽ vừa với bộ đệm 31 byte) – charliehorse55

Trả lời

8

Hàm nhìn vào giá trị là cấu trúc proc_bsdshortinfo. Nó được giới hạn trả về một chuỗi 16 byte, hoặc 15 ký tự có thể đọc được khi bao gồm dấu kết thúc null.

Từ sys/param.h:

#define MAXCOMLEN 16  /* max command name remembered */ 

Từ sys/proc_info.h:

struct proc_bsdshortinfo { 
     uint32_t    pbsi_pid;  /* process id */ 
     uint32_t    pbsi_ppid;  /* process parent id */ 
     uint32_t    pbsi_pgid;  /* process perp id */ 
    uint32_t    pbsi_status;  /* p_stat value, SZOMB, SRUN, etc */ 
    char     pbsi_comm[MAXCOMLEN]; /* upto 16 characters of process name */ 
    uint32_t    pbsi_flags;    /* 64bit; emulated etc */ 
     uid_t     pbsi_uid;  /* current uid on process */ 
     gid_t     pbsi_gid;  /* current gid on process */ 
     uid_t     pbsi_ruid;  /* current ruid on process */ 
     gid_t     pbsi_rgid;  /* current tgid on process */ 
     uid_t     pbsi_svuid;  /* current svuid on process */ 
     gid_t     pbsi_svgid;  /* current svgid on process */ 
     uint32_t    pbsi_rfu;  /* reserved for future use*/ 
}; 

EDIT: Để làm được việc này, có thành phần đường dẫn mới nhất:

pid_t pid = 3051; 
char pathBuffer [PROC_PIDPATHINFO_MAXSIZE]; 
proc_pidpath(pid, pathBuffer, sizeof(pathBuffer)); 

char nameBuffer[256]; 

int position = strlen(pathBuffer); 
while(position >= 0 && pathBuffer[position] != '/') 
{ 
    position--; 
} 

strcpy(nameBuffer, pathBuffer + position + 1); 

printf("path: %s\n\nname:%s\n\n", pathBuffer, nameBuffer); 
+0

Cảm ơn bạn. Bạn có biết cách giải quyết vấn đề này không? – fdh

+0

lấy đường dẫn đầy đủ và sau đó cắt chuỗi xuống thành phần đường dẫn cuối cùng. – charliehorse55

+0

Không có giải pháp thanh lịch hơn? Xem xét việc truy xuất thông tin quy trình là một phần quan trọng của nhiều chương trình, sẽ có một giao diện hiệu quả hơn để truy xuất thông tin đó. – fdh

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