Dato un processo 'pid, come posso determinare se il processo è in pausa (con SIGSTOP) o in esecuzione?Determina se il processo è in pausa (con SIGSTOP) su OS X con C
Sto usando OS X, quindi non ho una directory /proc
.
Dato un processo 'pid, come posso determinare se il processo è in pausa (con SIGSTOP) o in esecuzione?Determina se il processo è in pausa (con SIGSTOP) su OS X con C
Sto usando OS X, quindi non ho una directory /proc
.
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;
}
Non è una buona risposta, ma è una risposta .. puoi eseguire ps aux (dal tuo programma) e vedere se la colonna STAT è T (interrotta). Ho appena controllato quello sul leone di montagna.
Non sono sicuro come lo calcola.
penso che sto avvicinando con le funzioni kvm_ *:
Get other process' argv in OS X using C
anche
kvm_getargv()
http://www.daemon-systems.org/man/kvm_getproc2.3.html e la fonte per PS: http://bxr.su/o/bin/ps/ps.c
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)