前言
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(), ^{
//通知进程退出,做退出前的清理工作
});
});
}