Bir ebeveyn süreci oluşturmaya çalışıyorum, ebeveyninin izini sürmesini istiyor. Bundan sonra çocuk ebeveynine bağlamaya çalışır. Bazı koruma nedenlerinden dolayı süreçler yalnızca çocuklarını izleyebilir, bu yüzden kodumu sudo
ile yürütmem gerekiyor. İki süreç arasında biraz iletişim kurmak istiyorum, bu yüzden ebeveyne bir do-while döngüsü koydum. Çocuk feshederse ebeveyn de sonlandırılmalıdır. Benim çıktım sadece Child is traced
, bu yüzden çocuğun ebeveyne bağlı olmadığını varsayalım.Birbirini takip eden süreçler
#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);
}
dışarı yorumlarında raise(SIGTRAP)
alıyorum:
Child is traced
Child is tracing
Child exiting...
Parent exiting...