Ich versuche, einen Kindprozess zu erstellen, der seine Eltern auffordert, ihn zu verfolgen. Danach versucht das Kind, sich an seine Eltern anzuhängen. Aus Sicherheitsgründen können Prozesse nur ihre untergeordneten Elemente verfolgen, daher muss ich meinen Code mit sudo
ausführen. Ich möchte etwas Kommunikation zwischen den zwei Prozessen schaffen, deshalb lege ich eine Do-while-Schleife in den Eltern. Wenn das Kind beendet wird, sollte der Elternteil ebenfalls enden. Meine Ausgabe ist nur Child is traced
, also nehme ich an, dass das Kind nicht an das Elternteil anfügt.Prozesse, die einander verfolgen
#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);
}
Kommentar aus den raise(SIGTRAP)
ich:
Child is traced
Child is tracing
Child exiting...
Parent exiting...