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 배열을 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;
}
그리고 아직도 스택을 분쇄합니다.
어떤 lib가 openproc()입니까? 내가 Google에서 찾은 하나는 다소 다르게 보입니다. –
procps-3.2.8, 그것은 헤더 파일을보고있는 경우 DIR/proc/readproc.h에 있습니다. – user1011071
테스트 할 수는 없지만, 정적 pid_t mypid [2]; 대신 memset? –