2013-06-09 2 views
5

एक प्रक्रिया 'पिड को देखते हुए, मैं कैसे निर्धारित कर सकता हूं कि प्रक्रिया रोक दी गई है (सिगस्टॉप के साथ) या चल रहा है?निर्धारित करें कि प्रक्रिया को रोक दिया गया है (एसआईजीएसटीओपी के साथ) ओएस एक्स पर सी

मैं ओएस एक्स का उपयोग कर रहा हूं, इसलिए मेरे पास /proc निर्देशिका नहीं है।

उत्तर

2

यह है कि आप इसे कैसे करते हैं:

#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; 
} 
2

यह कोई अच्छा जवाब नहीं है, लेकिन यह एक उत्तर है .. आप ps aux (अपने प्रोग्राम के भीतर से) चला सकते हैं और देख सकते हैं कि स्टेट कॉलम टी (रुक गया है)। पहाड़ शेर पर बस जांच की।

यह सुनिश्चित नहीं है कि यह इसका आंकलन कैसे करता है।

मुझे लगता है मैं kvm_ * कार्यों के साथ करीब हो रही है:

Get other process' argv in OS X using C

भी

kvm_getargv()

http://www.daemon-systems.org/man/kvm_getproc2.3.html और पी एस के लिए स्रोत: http://bxr.su/o/bin/ps/ps.c

0

man ps में आप इस प्रक्रिया के बारे में T राज्य पढ़ सकते हैं:

T एक बंद कर दिया प्रक्रिया में चिह्नित करता है।

निर्धारित करने के लिए प्रक्रिया बंद कर दिया जाता है, ps j चल stat कॉलम में आप T झंडा दिखा देंगे।

सभी मौजूदा बंद प्रक्रियाओं को दिखाने के लिए बैश में, चलाएं: jobs -s (देखें help jobs)। उन्हें मारने के लिए चलाएँ: kill $(jobs -sp).

इन प्रक्रियाओं वर्तमान खोल से जुड़ी नहीं हैं, तो सभी प्रक्रियाओं बंद कर दिया दिखाने के लिए, इस आदेश को मदद मिल सकती है:

:

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

यहाँ सभी प्रक्रियाओं बंद कर दिया फिर से शुरू करने आदेश है

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

इसके बजाय इन प्रक्रियाओं को मारने के लिए, के साथ -CONT को प्रतिस्थापित करें।

आप प्रक्रियाओं को रोक दिया है तो उन्हें (T के साथ) बंद कर दिया नहीं दिखाया जाएगा, ताकि को फिर से शुरू उन्हें, बजाय निम्न आदेश का उपयोग:

pkill -CONT -u $UID 

या एक विशिष्ट प्रक्रिया के लिए (जैसे क्रोम), कोशिश करें:

kill -CONT $(pgrep Chrome) 
संबंधित मुद्दे