2012-06-28 73 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); 
}