2013-04-09 47 views
0

我的函數從/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)); 
} 

回答

2

看看這個:

psinfo_t* pData = (psinfo_t*) buffer; 
free(buffer); 
... 
int pr_pid=pData->pr_pid; 

您將pData設置爲第一行和第一行中的緩衝區內容解放它。 pData指向的東西現在已經丟失給你,它實際上可能會在下一個malloc中重用。當你在上面的最後一行嘗試使用它時,你正在閱讀誰知道什麼。在這種情況下,你太過於激進了。在完成使用之前,不要釋放pData(間接通過緩衝區)。

+0

是的。那,我有另一個錯誤,我剛剛在stat中發現,應該已經使用'stat(fullPath,buffer);' – Xyzk 2013-04-09 13:17:54

+0

@Xyzk:不要使用'struct stat'結構,直到你驗證了stat ()'調用工作。與'fread()' - 和'malloc()'類似。也不清楚爲什麼你不只是創建'psinfo_t info',並且將'&info'作爲第一個參數傳遞給'fread()'。這可以節省'malloc()'和'free()',並且不需要醜陋的鑄造。 – 2013-04-09 13:52:24

+0

@JonathanLeffler「也不清楚你爲什麼不創建自己的psinfo_t信息;」好吧,這是因爲我沒有想到它:)稍後會修改我的代碼。關於你的其他觀點也一樣。出於某種原因,我停止將它們視爲文件。 – Xyzk 2013-04-09 15:19:21