iPhone开发之-kill(pid_t pid, int sig) 的用法

kill 主要用来杀死某个进程.
kill函数的定义和原型如下:
int kill(pid_t pid, int sig);
使用时要引入如下的两个头文件:
#include <sys/types.h>
#include <signal.h>
参数说明:
pid:可能选择有以下四种:
1. pid大于零时,pid是信号欲送往的进程的标识。
2. pid等于零时,信号将送往所有与调用kill()的那个进程属同一个使用组的进程。
3. pid等于-1时,信号将送往所有调用进程有权给其发送信号的进程,除了进程1(init)。
4. pid小于-1时,信号将送往以-pid为组标识的进程。


返回说明:
成功执行时,返回0。失败返回-1,errno被设为以下的某个值
EINVAL:指定的信号码无效
EPERM;没有给任何目标进程发送信号的权限
ESRCH:目标进程或进程组不存在

上面的函数定义很简单,不用过多解释, 前段时间在业务上需要得到一个进程是是不是还在running,还是stop 掉了, 如果是stop了, 那么就要重启启动这个进程。man 了一把, 原来kill函数还可以来查进程的基本状态

const pid_t invaild_process_id = -1;

typedef enum

{

process_running = 0,

        process_stoped

 

}process_state; // 基本状态定义

typedef _process

{

pid_t                    pid;

        char                     *pro_name;

        process_state     stat;

        uint32_t               handle_count; //打开文件数

        uint32_t               thread_count; //含有线程数

        struct timeval       sys_time; //内核用掉的时间

        struct timeval       user_time; //用户时间

        struct timeval       total_time; //用掉的总时间

        uint32_t               memory_size; //用掉的内存数

        uint32_t               virtual_size; //用掉的虚拟内存数

        queue_t               *thread_queue; // 线程队列

        uint32_t               process_priority          //进程的优先级

}process_t;

.......// 前面业务处理

process_state check_process_state(process_t *process)

{

if(process->pid == invaild_process_id)

{

return process_stoped;

}

// 当kill的第2个参数是0的时候, 其实0的signo是不存在的, 这个函数会替我们“检查” 该进程是否还在运行

// 如果返回是0, 说明该进程还在run, 如果返回-1,如果你确定该进程id是存在的, 那么说明它已经stop掉了, 也就是说down  // 掉了,记住, 进程不会被杀掉, 因为signo 不存在

switch(kill(process->pid, 0)){

case 0 :

return process_running;

case -1:

if(errno == ESRCH)

{

return process_stoped;

}

.......

}

}

很好用 不是吗?

你可能感兴趣的:(iPhone开发之-kill(pid_t pid, int sig) 的用法)