Mir*_*lad 6 c linux ptrace fork process
问题陈述:程序C由循环组成.该程序的执行必须由另一个定期显示受控过程进度的过程控制.kill(pid, SIGSTOP),函数后ptrace(PTRACE_PEEKTEXT,pid,...)不再找到C进程.从我所读到的,ptrace(PTRACE_PEEKTEXT,pid,...),当被识别的过程pid停止时,它应该工作.
我不知道究竟是什么遗漏,所以任何帮助都将不胜感激.以下是我到目前为止所做的事情:
有两个过程,P和Ç.
第一个进程(P)通过fork()创建第二个进程(C ).
C的代码是这样的:
int i = 0;
int main() {
ptrace(PTRACE_TRACEME, 0, NULL, NULL);
printf("Memory address = %p", (void *)&i);
while(1) { i++;}
}
Run Code Online (Sandbox Code Playgroud)
P的代码如下:
{...}
switch (pid = fork()) {
case 0: /* the child */
if (execl("C", "", (char *) NULL) == -1) {
perror("execl");
}
break;
case -1: /* Error */
perror("fork");
exit(EXIT_FAILURE);
default: /* the parent */
sleep(1);
kill(pid, SIGSTOP);
wait(&status);
if (WSTOPSIG(status)==SIGSTOP) {
printf("%s","Child was interrupted. Insert memory address\n");
scanf("%p",&address);
printf("Address = %p", address);
data = ptrace(PTRACE_PEEKTEXT, pid, address,NULL);
if(data==-1){
if(errno){
printf("%s\n","Error at PEEKTEXT\n");
printf("%s\n",strerror(errno));
}
if(errno == ESRCH){
printf("%s\n","ESRCH error\n");
}
if(errno == EIO){
printf("%s\n","EIO error\n");
}
}
printf("***Data retrieved is: %ld\n",data);
data = ptrace(PTRACE_CONT, pid, 0, 0);
}
if(WIFEXITED(status)){
printf("[Parent] - Child's exit status is: %d \n", WEXITSTATUS(status));
break;
}
break;
}
{...}
Run Code Online (Sandbox Code Playgroud)
输出是:
地址= 0x60104c
而错误的是:
PEEKTEXT出错
没有这样的过程
ESRCH错误
***检索到的数据是:-1