我的函數從/proc
中讀取進程列表,然後將進程psinfo
文件讀入正確的結構以及關於此文件的數據並打印出來。 問題是,這些結構中的某些數據是錯誤的。像往常一樣,程序部分工作的時刻是最令人困惑的。它讀取的所有數據都是正確的,除了PID(pr_pid)(始終爲0)和文件的UID(也總是爲0)外。爲什麼?數據是否可以部分正確加載?這應該是不可能的。如果我們在談論PPID,0將是可能的,但是solaris文檔明確指出pr_pid是PID。 鏈接,我認爲將有答案,但我無法找到一個:stat中的UID值錯誤,psinfo_t中的pr_pid值錯誤
http://docs.oracle.com/cd/E19963-01/html/821-1473/proc-4.html http://linux.die.net/man/3/getpwnam http://linux.die.net/man/2/stat
代碼:
void printProcessInformation(char pid[]){
//find full path name to your "stat" file
//DIR *dir;
//struct dirent *ent;
//Creating string with /proc/PID
char * s = malloc(snprintf(NULL, 0, "%s%s", "/proc/", pid) + 1);
sprintf(s, "%s%s", "/proc/", pid);
//Creating string with /proc/PID/psinfo (full path)
char * fullPath = malloc(snprintf(NULL, 0, "%s%s", s, "/psinfo") + 1);
sprintf(fullPath, "%s%s", s, "/psinfo");
free(s);
//printf("%s\n",fullPath);
//Reading data from file
FILE* file = fopen(fullPath, "r");
char* buffer;
buffer = (char*) malloc(sizeof(psinfo_t));
if(file == NULL)
{
perror("Error: Couldn't open file");
return;
}
fread((void *)buffer, sizeof(psinfo_t), 1, file);
psinfo_t* pData = (psinfo_t*) buffer;
free(buffer);
buffer = (char*) malloc(sizeof(stat));
stat(file,buffer);
struct stat* fileStat=(struct stat*) buffer;
printf("File owner id:%d\n",fileStat->st_uid);
free(buffer);
fclose(file);
struct passwd* pw=getpwuid(fileStat->st_uid);
//Loading data from structures
time_t sTime=pData->pr_start.tv_sec;
int pr_pid=pData->pr_pid;
char* fname=pData->pr_fname;
char* uid=pw->pw_name;
printf("%8s %5d %16s %.24s\n", uid, pr_pid, fname, ctime(&sTime));
}
是的。那,我有另一個錯誤,我剛剛在stat中發現,應該已經使用'stat(fullPath,buffer);' – Xyzk 2013-04-09 13:17:54
@Xyzk:不要使用'struct stat'結構,直到你驗證了stat ()'調用工作。與'fread()' - 和'malloc()'類似。也不清楚爲什麼你不只是創建'psinfo_t info',並且將'&info'作爲第一個參數傳遞給'fread()'。這可以節省'malloc()'和'free()',並且不需要醜陋的鑄造。 – 2013-04-09 13:52:24
@JonathanLeffler「也不清楚你爲什麼不創建自己的psinfo_t信息;」好吧,這是因爲我沒有想到它:)稍後會修改我的代碼。關於你的其他觀點也一樣。出於某種原因,我停止將它們視爲文件。 – Xyzk 2013-04-09 15:19:21