-1

私は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配列をnullで終了させることなので、変更しました私のコード:

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;
}

そしてそれはまだスタックを押しつぶします。

4

2 に答える 2

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);
}
于 2012-06-29T09:54:39.907 に答える