2013-06-09 33 views

Trả lời

2

Đây là cách bạn thực hiện:

#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

Nó không phải là một câu trả lời tuyệt vời, nhưng nó là một câu trả lời .. bạn có thể chạy ps aux (từ bên trong chương trình của bạn) và xem cột STAT là T (dừng). Chỉ cần kiểm tra rằng trên sư tử núi.

Bạn không chắc chắn cách tính toán.

Tôi nghĩ rằng tôi nhận được gần gũi hơn với các chức năng kvm_ *:

Get other process' argv in OS X using C

cũng

kvm_getargv()

http://www.daemon-systems.org/man/kvm_getproc2.3.html và nguồn cho PS: http://bxr.su/o/bin/ps/ps.c

0

Trong man ps bạn có thể đọc về T trạng thái của quá trình:

T Đánh dấu một quá trình dừng lại.

Để xác định xem quá trình có bị ngừng hay không, chạy ps j sẽ hiển thị cho bạn T cờ trong cột stat.

Trong Bash để hiển thị tất cả các quy trình đã dừng hiện tại, hãy chạy: jobs -s (xem help jobs). Để giết chúng chạy: kill $(jobs -sp).

Nếu các quá trình này không được gắn vào vỏ hiện nay, để hiển thị tất cả các quy trình dừng lại, lệnh này có thể giúp:

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

Đây là lệnh để khôi phục lại tất cả các quy trình dừng lại:

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

Để thay thế các quy trình này, hãy thay thế -CONT bằng .

Nếu bạn đã tạm dừng quy trình, họ sẽ không hiển thị như dừng lại (với T), do đó để resume họ, sử dụng lệnh sau thay vì:

pkill -CONT -u $UID 

hoặc cho một quá trình cụ thể (chẳng hạn như Chrome), hãy thử:

kill -CONT $(pgrep Chrome) 
Các vấn đề liên quan