CFMessagePortRef问题

在获取了root的Daemon中使用CFMessagePortRef,服务启动了,但是马上又重启了,log如下
Jul 11 09:08:47 oh TestDaemond[624]: iOSRE: rootdaemond is launched!
Jul 11 09:08:47 oh com.apple.launchd[1] (com.test.daemond): (com.test.daemond) Throttling respawn: Will start in 10 seconds
Jul 11 09:08:57 oh TestDaemond[626]: MS:Notice: Injecting: com.tcapp.tcapp [TestDaemond] (847.27)
Jul 11 09:08:57 oh TestDaemond[626]: iOSRE: rootdaemond is launched!

同样的代码,在tweak中挂在Springboard中就是能正常的,大神们给看下咋回事呢?

代码如下
int main(int argc, char **argv, char **envp)
{
NSLog(@“iOSRE: rootdaemond is launched!”);
CFMessagePortRef mMsgPortListenner = CFMessagePortCreateLocal(kCFAllocatorDefault,CFSTR(LOCAL_MACH_PORT_NAME_DAEMOND),onRecvMessageCallBack, NULL, NULL);

	CFRunLoopSourceRef source = CFMessagePortCreateRunLoopSource(kCFAllocatorDefault, mMsgPortListenner, 0);
	NSLog(@"TouchControl source=:%@",source);
	CFRunLoopAddSource(CFRunLoopGetCurrent(), source, kCFRunLoopCommonModes); 
    return 0;

}

makefile

export THEOS=/var/theos
include $(THEOS)/makefiles/common.mk

TOOL_NAME = TestDaemond
TestDaemond_FRAMEWORKS = Foundation CoreFoundation
TestDaemond_FILES = main.mm

include $(THEOS_MAKE_PATH)/tool.mk

你这个看上去是daemon本身的问题啊!把daemon中的功能代码全部去掉,光加个NSLog,看看运行是否正常?

CFRunLoopRun();在daemon添加了这个后正常了,这个是必须的吗 ?

那个帖子里写得很清楚了,这个函数是让daemon在runloop里跑起来的关键啊

我在SpringBoard里用CFMessage没有使用runloop也是正常的,所以我想当然的就以为是也不需要,是不是SpringBoard里有个runloop进程了,而我自己的daemon中没有在run的loop,所以要自己开一个runloop ?

看看RunLoop的定义。
SpringBoard本身就是长期运行,常驻run loop的,你可以把它看成是一个有界面的daemon;你自己的创建的daemon,比如加入run loop中,才能让它长期运行,不然这个daemon就只是一个命令行工具,执行完了就不在内存里了