2012-06-28 117 views
-1

我一直在編寫一個程序,試圖使用procps庫找到它自己。 但由於某種原因,它會摧毀堆棧。 這是我的代碼:procps導致堆棧粉碎

int main(){ 
    PROCTAB *ptp; 
    proc_t task; 
    pid_t mypid[1]; 
    mypid[0] = getpid(); 
    printf("My id: %d\n", mypid[0]); 
    ptp = openproc(PROC_PID, mypid, 1); 
    if(readproc(ptp, &task)){ 
     printf("Task id:%d\n",task.XXXID); 
    } 
    else{ 
     printf("Error: could not find currect task\n"); 
    } 
    closeproc(ptp); 
    printf("Done\n"); 
    return 0; 
} 

輸出,當我運行的程序是我得到:

$ ./test 
My id is: 8514 
Task id is:8514 
Done 
*** stack smashing detected ***: ./test terminated 
======= Backtrace: ========= 
/lib/i386-linux-gnu/libc.so.6(__fortify_fail+0x45)[0xb7688dd5] 
/lib/i386-linux-gnu/libc.so.6(+0xffd8a)[0xb7688d8a] 
./test[0x804863e] 
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb75a24d3] 
./test[0x80484f1] 
======= Memory map: ======== 
... 
Aborted (core dumped) 

任何人有一個想法,爲什麼會發生? 我做錯了什麼? 謝謝。

編輯︰ 我已經看了頭文件,並注意到我已經做了錯誤的使用openproc函數正確的方式來使用它(對於PID)是讓mypid數組爲空終止,所以我已經將我的代碼更改爲:

int main(){ 
    PROCTAB *ptp; 
    proc_t task; 
    pid_t mypid[2]; 
    mypid[0] = getpid(); 
    memset(&mypid[1], 0, sizeof(pid_t)); 
    printf("My id: %d\n", mypid[0]); 
    ptp = openproc(PROC_PID, mypid); 
    if(readproc(ptp, &task)){ 
     printf("Task id:%d\n",task.XXXID); 
    } 
    else{ 
     printf("Error: could not find currect task\n"); 
    } 
    closeproc(ptp); 
    printf("Done\n"); 
    return 0; 
} 

它仍然壓碎堆棧。

+0

從openproc()的庫是什麼?我在谷歌找到的那個看起來有些不同。 –

+0

procps-3.2.8,它位於DIR/proc/readproc.h如果你正在看頭文件 – user1011071

+0

我不能測試,但你可以嘗試'靜態pid_t mypid [2];'而不是memset的? –

回答

2

它適用於我這裏。獲得該版本中的procps後,編譯和運行良好:

$ gcc -Wall -Werror -o rp -L. -lproc-3.2.8 rp.c 
$ ./rp 
My id: 11468 
Task id:11468 
Done 

更新

嘗試修改後的版本:

proc_t *result; 
... 
if((result = readproc(ptp, NULL))){ 
    printf("Task id:%d\n",result->XXXID); 
    free(result); 
} 
+0

怪異..不適用於我...你在哪個系統上運行? – user1011071

+0

這是一個2.6.18內核的Debian擠壓。 –

+0

@ user1011071我已經更新了我的答案。 –

0

一個可能的原因您的崩潰是事實readproc()返回的proc_t結構具有其他動態分配的元素,例如環境變量或命令行參數。更安全的方法是讓readproc()分配整個結構,然後使用freeproc()釋放它:

while ((proc_info = readproc(proc, nullptr)) != NULL) { 
    // do something with proc_info 
    freeproc(proc_info); 
}