누군가가 Wikipedia "ptrace" article에 추가되었습니다. Linux에서는 ptraced 프로세스가 다른 프로세스를 ptrace 할 수 없다고 주장했습니다. 나는 그런 경우인지 (그리고 왜 그런지) 판단하려고한다. 다음은 이것을 테스트하기 위해 고안 한 간단한 프로그램입니다. 내 프로그램이 실패합니다 (하위 하위 프로세스가 제대로 실행되지 않음). 그러나 저는 이것이 내 오류이고 근본적인 것이 아니라고 확신합니다. 본질적ptraced Linux 프로세스 내에서 ptrace 호출
초기 프로세스 포크 B 턴 포크에 C 처리. 는 하위 B, 그 자식 C을 ptraces B ptraces. 설정이 끝나면 세 프로세스 모두가 A
, B
또는 C
을 매초마다 표준 출력으로 인쇄합니다. 무슨 실제로
는 및 B 잘 작동하지만, C 인쇄 한 번만 다음 내동댕이 것입니다. ps -eo pid,cmd,wchan
으로 확인하면 커널 함수 ptrace_stop
에 붙어있는 C이 표시되고, 나머지는 hrtimer_nanosleep
에있는 반면, 나는이 세 가지 모두를 기대합니다.
매우 세 가지 모두가 작동하기 때문에 (프로그램이 C와 As 및 Bs를 인쇄하므로) 초기 설정에서 경쟁 조건이 있다고 생각하게 만듭니다.
내 추측 잘못 될 수도 무엇인지에은 다음과 같습니다
- 뭔가 보고와 함께 할 수있는
SIGCHLD
관련 C에 신호와 함께 할 수있는SIGCHLD
을보고 B 에, B (두 pids에 대한 PTRACE_CONT의 해킹 호출은 문제를 해결하지 못함)에서 오는 것으로보고 (2) 기다립니다. - C는 B 의해 ptraced한다 - C가 (B의 통화의 ptrace 및 에 오류하지도 않고이를 덮어) 대신 의해 상속의 ptrace 없다?
내가 뭘 잘못하고 있는지 알아낼 수 있습니까? 감사.
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <sys/ptrace.h>
#include <sys/wait.h>
static void a(){
while(1){
printf ("A\n");
fflush(stdout);
sleep(1);
}
}
static void b(){
while(1){
printf ("B\n");
fflush(stdout);
sleep(1);
}
}
static void c(){
while(1){
printf ("C\n");
fflush(stdout);
sleep(1);
}
}
static void sigchld_handler(int sig){
int result;
pid_t child_pid = wait(NULL); // find who send us this SIGCHLD
printf("SIGCHLD on %d\n", child_pid);
result=ptrace(PTRACE_CONT, child_pid, sig, NULL);
if(result) {
perror("continuing after SIGCHLD");
}
}
int main(int argc,
char **argv){
pid_t mychild_pid;
int result;
printf("pidA = %d\n", getpid());
signal(SIGCHLD, sigchld_handler);
mychild_pid = fork();
if (mychild_pid) {
printf("pidB = %d\n", mychild_pid);
result = ptrace(PTRACE_ATTACH, mychild_pid, NULL, NULL);
if(result==-1){
perror("outer ptrace");
}
a();
}
else {
mychild_pid = fork();
if (mychild_pid) {
printf("pidC = %d\n", mychild_pid);
result = ptrace(PTRACE_ATTACH, mychild_pid, NULL, NULL);
if(result==-1){
perror("inner ptrace");
}
b();
}
else {
c();
}
}
return 0;
}
가 도움이되지만 알 수 없습니다'의 ptrace (PTRACE_CONT는 child_pid, SIG, NULL)'... 당신은 아마 의미 '의 ptrace (PTRACE_CONT, child_pid, NULL, 시그마)'(데이터 = SIG) – remram