监听进程退出事件

前言

cocoa进程在异常退出的时候经常无法被AppDelegate监测到,于是乎采用一种更为底层的方式监听

#include <sys/event.h>


- (void)listenPid:(NSInteger)processID
{
    //需要将监听放入后台线程
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        pid_t pid = (pid_t)processID;
        if (pid > 0) {
            int kq=kqueue();
            if (kq == -1) {
                fprintf(stderr,"kqueue returned -1.");
                return ;
            }
            
            struct kevent ke;
            EV_SET(&ke, pid, EVFILT_PROC, EV_ADD, NOTE_EXIT, 0, NULL);
            
            if (kevent(kq, &ke, 1, NULL, 0, NULL)<0) {
                fprintf(stderr,"kevent failed.");
            }
            
            
            for(;;) {
                memset(&ke,0,sizeof(struct kevent));
                if(kevent(kq, NULL, 0, &ke, 1, NULL)<0){
                    fprintf(stderr,"kevent failed.");
                }
                
                if (ke.fflags & NOTE_EXIT) {
                    fprintf(stderr,"app exit.");
                    break;
                }
            }
        }
        
        dispatch_async(dispatch_get_main_queue(), ^{
            //通知进程退出,做退出前的清理工作
        });
    });
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 线程、进程 1.iOS中的多线程操作、多线程方式? 2.多线程的优点和缺点分别是什么? 答:优点:1、将耗时较长的...
    丶逐渐阅读 1,417评论 0 8
  • 世上有些事,一旦错过就追悔莫及。比如,当进程退出时,如果有些事没做完该怎么办呢? 进程退出事件 顾名思义,Linu...
    阿棍儿_Leon阅读 822评论 0 51
  • 1.设计模式是什么? 你知道哪些设计模式,并简要叙述?设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型...
    龍飝阅读 2,229评论 0 12
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,615评论 28 53
  • 信任包括信任自己和信任他人 很多时候,很多事情,失败、遗憾、错过,源于不自信,不信任他人 觉得自己做不成,别人做不...
    吴氵晃阅读 6,233评论 4 8