2012-09-05 15 views
6

OSX Mountain Lion'dayım ve PID kullanarak bir işlemin adını almaya çalışıyorum. Ancak bu sadece ilk 15 karakteri alır vePID'den ad al?

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); 

yukarıdaki kod düzgün adı almak yapabiliyor, gerisini "yok sayar":

aşağıdaki

kullanıyorum kodudur. Bunun adın görüntülenmesiyle ilgili bir sorun olmadığını, ancak 'un'u aldığını unutmayın. Yukarıdaki kodu, bağımsız bir uygulamada test ettiğim için sorun, uygulamamın geri kalanıyla ilgili değil. Ayrıca, PID'yi değiştirmeyi denedim, fakat PID'yi denediğimden bağımsız olarak, yalnızca ismin ilk 15 karakterini alır. Yol alma işlemi mükemmel çalışır.

Yanlış yaptığım şey hakkında herhangi bir fikri olan var mı?

+0

, ben biraz daha tuhaflık buldu. Belirtilen arabellek uzunluğu 32 bayttan azsa, ad kısa olsa bile (ve 31 bayt arabelleğine sığacak şekilde) dizeye hiçbir şey eklenmeyecektir. – charliehorse55

cevap

8

İşlev, değere proc_bsdshortinfo numaralı yapıya bakar. Boş sonlandırıcı eklendiğinde 16 baytlık bir dize veya 15 okunabilir karakter döndürmekle sınırlıdır. sys/param.h itibaren

:

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

sys/proc_info.h Gönderen:

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*/ 
}; 

DÜZENLEME: Bundan kaçınmak için, son yol bileşenini olsun: Bu sorunu araştırdık gibi

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

Teşekkür ederim. Herhangi bir ihtimalden, bunun bir çözümü var mı? – fdh

+0

tam yolunu alın ve dizgiyi en son yol bileşenine kadar kırpın. – charliehorse55

+0

Daha şık bir çözüm yok mu? Alım bilgilerinin alınması birçok programın hayati bir parçası olduğundan, bu bilgileri almak için daha verimli bir arayüz olmalıdır. – fdh