我一直在編寫一個程序,試圖使用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;
}
它仍然壓碎堆棧。
從openproc()的庫是什麼?我在谷歌找到的那個看起來有些不同。 –
procps-3.2.8,它位於DIR/proc/readproc.h如果你正在看頭文件 – user1011071
我不能測試,但你可以嘗試'靜態pid_t mypid [2];'而不是memset的? –