[vox-tech] Suspending a process by PID

Peter Jay Salzman vox-tech@lists.lugod.org
Mon, 22 Dec 2003 10:21:00 -0800


of course, this assumes you wanted to do it from a C program...   ;-)

heh.

pete



On Mon 22 Dec 03, 10:18 AM, Peter Jay Salzman <p@dirac.org> said:
> hey nicole,
> 
> yeah, sure it's possible.  i'm surprised that sending SIGSTOP/SIGCONT
> doesn't work.  but then again, i've never tried that.
> 
> anyway, using ptrace() to attach to a process will make the process a
> child and suspend it immediately.  you can then step through
> instructions, look at memory maps and all kinds of neat stuff.  for
> instnace, you can use this kind of thing to cheat at games.  neat stuff.
> 
> more than you wanted, but it has the effect you desire (i think).
> 
> here's some code i wrote that attaches to a process:
> 
> bool Process::attach(void)
> {
>    int status;
> 
>    if(attached) {
>       attached++;
>       return true;
>    }
> 
>    // Request to attach.
>    if(ptrace(PTRACE_ATTACH, pid, 0, 0) == -1) {
>       return(false);
>    }
> 
>    // Wait for the child to tell us it worked
>    if(waitpid(pid, &status, WUNTRACED) != pid) {
>       return false;
>    }
>    if(!WIFSTOPPED(status)) {
>       return false;
>    }
> 
>    attached++;
>    return true;
> }
> 
> and detach from the process:
> 
> 
> 
> bool Process::detach(void)
> {
> 
>    // Fail if we we're unattached.
>    if(! attached)
>       return false;
> 
>    if(attached - 1 == 0) {
> 
>       // I don't know why it's supposed to be 1 either. ;)
>       if(ptrace(PTRACE_DETACH, pid, 1, 0) == -1) {
>          return(false);
>       }
> 
>       memoryMaps.clear();
>    }
> 
>    attached--;
>    return true;
> }
> 
> 
> pete
> 
> 
> 
> 
> On Mon 22 Dec 03,  9:57 AM, Nicole TWN <ana.ng@tmbg.org> said:
> > Hi gang
> > 
> > Anyone know how to suspend a process given its PID?
> > 
> > It seems like it should be possible, via signals or something, but I can't 
> > find how.
> > 
> > Thanks
> > 
> > --nicole twn

-- 
Make everything as simple as possible, but no simpler.  -- Albert Einstein
GPG Instructions: http://www.dirac.org/linux/gpg
GPG Fingerprint: B9F1 6CF3 47C4 7CD8 D33E 70A9 A3B9 1945 67EA 951D