detach 必須在進程stop狀態下才能退出,如果要detach一個未stop的進程,先用調用:
kill(pid,SIGSTOP);
wait();
ptrace(PTRACE_DETACH,pid,NULL,NULL);
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <getopt.h>
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#define PROC_STAT_STOP "T (stopped)"
#define PROC_STAT_SLEEP "S (sleeping)"
#define PROC_STAT_RUING "R (running)"
#define PROC_STAT_DISK_SLEEP "D (disk sleep)"
#define PROC_STAT_TRACE_STOP "T (tracing stop)"
#define PROC_STAT_ZOMBIE "Z (zombie)"
#define PROC_STAT_DEAD "X (dead)"
#define _PRINT_ERR_ printf("ERRNO:%d INFO:%s\n",errno,strerror(errno));
const char * SIGNAL_NAME[] =
{
/*0*/ "NO-SIGNAL", //sigal start from 1
/*1*/ "SIGHUP",
/*2*/ "SIGINT",
/*3*/ "SIGQUIT",
/*4*/ "SIGILL",
/*5*/ "SIGTRAP",
/*6*/ "SIGABRT",
/*7*/ "SIGBUS",
/*8*/ "SIGFPE",
/*9*/ "SIGKILL",
/*10*/ "SIGUSR1",
/*11*/ "SIGSEGV",
/*12*/ "SIGUSR2",
/*13*/ "SIGPIPE",
/*14*/ "SIGALRM",
/*15*/ "SIGTERM",
/*16*/ "SIGSTKFLT",
/*17*/ "SIGCHLD",
/*18*/ "SIGCONT",
/*19*/ "SIGSTOP",
/*20*/ "SIGTSTP",
/*21*/ "SIGTTIN",
/*22*/ "SIGTTOU",
/*23*/ "SIGURG",
/*24*/ "SIGXCPU",
/*25*/ "SIGXFSZ",
/*26*/ "SIGVTALRM",
/*27*/ "SIGPROF",
/*28*/ "SIGWINCH",
/*29*/ "SIGIO",
/*30*/ "SIGPWR",
/*31*/ "SIGSYS",
/*34*/ "SIGRTMIN",
/*35*/ "SIGRTMIN+1",
/*36*/ "SIGRTMIN+2",
/*37*/ "SIGRTMIN+3",
/*38*/ "SIGRTMIN+4",
/*39*/ "SIGRTMIN+5",
/*40*/ "SIGRTMIN+6",
/*41*/ "SIGRTMIN+7",
/*42*/ "SIGRTMIN+8",
/*43*/ "SIGRTMIN+9",
/*44*/ "SIGRTMIN+10",
/*45*/ "SIGRTMIN+11",
/*46*/ "SIGRTMIN+12",
/*47*/ "SIGRTMIN+13",
/*48*/ "SIGRTMIN+1