0
私は子プロセスを作成しようとしています。その後、子供はその親にアタッチしようとします。保護の理由から、プロセスでは子プロセスしか追跡できないため、sudo
でコードを実行する必要があります。私は2つのプロセスの間にいくつかのコミュニケーションを作りたいので、私は親にdo-whileループを入れます。子が終了する場合、親も終了する必要があります。私の出力はChild is traced
しかないので、私はその子が親に接続していないと仮定します。お互いをトレースするプロセス
raise(SIGTRAP)
をコメントアウト
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/ptrace.h>
#include <sys/wait.h>
void child();
void parent(pid_t pid);
int main() {
pid_t pid = fork();
if(pid == 0)
child();
else if(pid > 0)
parent(pid);
else{
perror("fork");
exit(EXIT_FAILURE);
}
}
void child(){
if(ptrace(PTRACE_TRACEME, 0, 0, 0) < 0){
perror("ptrace");
exit(EXIT_FAILURE);
}
printf("Child is traced\n");
pid_t ppid = getppid();
if(ptrace(PTRACE_SEIZE, ppid, NULL, NULL) != 0) {
perror("ptrace");
exit(EXIT_FAILURE);
}
printf("Child is tracing\n");
raise(SIGTRAP);
ptrace(PTRACE_DETACH, ppid, NULL, NULL);
printf("%s\n", "Child exiting...");
exit(EXIT_SUCCESS);
}
void parent(pid_t pid){
int status;
do{
waitpid(pid, &status, WUNTRACED | WCONTINUED);
if(WIFSTOPPED(status)){
printf("Child stopped: %d\n", WSTOPSIG(status));
if(WSTOPSIG(status) == 5){
printf("Stopsig status 5.\n");
}
ptrace(PTRACE_CONT, pid, 0, 0);
}
} while(!WIFEXITED(status) && !WIFSIGNALED(status));
ptrace(PTRACE_DETACH, pid, NULL, NULL);
printf("%s\n", "Parent exiting...");
exit(EXIT_SUCCESS);
}
:
Child is traced
Child is tracing
Child exiting...
Parent exiting...