2013-06-09 5 views

risposta

2

Ecco come lo fai:

#include <stdio.h> 
#include <sys/sysctl.h> 
#include <stdlib.h> 
#include <string.h> 

#define IS_RUNNING(proc) ((proc->kp_proc.p_stat & SRUN) != 0) 

#define ERROR_CHECK(fun) \ 
    do { \ 
     if(fun) { \ 
      goto ERROR; \ 
     }\ 
    } while(0) 

struct kinfo_proc *proc_info_for_pid(pid_t pid) { 
    struct kinfo_proc *list = NULL; 

    int mib[] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, pid}; 
    size_t size = 0; 

    ERROR_CHECK(sysctl(mib, sizeof(mib)/sizeof(*mib), NULL, &size, NULL, 0)); 

    list = malloc(size); 
    ERROR_CHECK(sysctl(mib, sizeof(mib)/sizeof(*mib), list, &size, NULL, 0)); 

    return list; 

ERROR: 
    if(list) { 
     free(list); 
    } 
    return NULL; 
} 

int main() { 
    pid_t pid = 1000; 
    struct kinfo_proc *proc_info = proc_info_for_pid(pid); 
    if(proc_info) { 
     printf("Is running: %d\n", IS_RUNNING(proc_info)); 
    } else { 
     printf("Could not stat process!"); 
     return 1; 
    } 
    return 0; 
} 
0

In man ps si può leggere su T stato del processo:

T segna un processo interrotto.

per determinare se il processo viene arrestato, in esecuzione ps j vi mostrerà T bandiera stat colonna.

In Bash per visualizzare tutti i processi arrestati in corso, eseguire: jobs -s (vedere help jobs). Per ucciderli eseguire: kill $(jobs -sp).

Se questi processi non sono attaccati alla shell corrente, per mostrare tutti i processi fermati, questo comando può aiutare:

ps wuax | awk '$8 ~ "T"' 

Ecco il comando per riprendere tutti i processi fermati:

kill -CONT $(ps wuax | awk 'NR>1 && $8 ~ "T" {print $2}') 

Per eliminare questi processi, sostituire -CONT con .

Se si è in pausa i processi, non mostreranno come smesso (con T), in modo da riprendere loro, usa il seguente comando invece:

pkill -CONT -u $UID 

o per un processo specifico (ad esempio Chrome), prova:

kill -CONT $(pgrep Chrome)