在多个平台上使用多种语言使用低级网络代码,我按照 Apple 开发者论坛中的这个示例获得了一个Network.framework示例。
dispatch_main()
,应用程序永远不会退出回命令行。
文档非常稀疏,示例也不常见,教程几乎不存在。在互联网上搜索时,我发现的只是提到这永远不会返回,但当我真正想返回时,我找不到任何有关如何摆脱它的信息。
我假设这依赖于 GCD(中央调度)和运行循环的背景知识,而我没有而且不容易找到。也许它只与命令行应用程序相关,但大多数 Apple 代码都是针对 GUI 的?
那么有没有办法摆脱/返回
dispatch_main
让我陷入的循环/线程/等?或者,当您打算返回时,除了 dispatch_main
之外,还有其他替代 API 或方法吗?
为此,您可能需要使用 C 函数
void exit(int status);
请参阅 man 3 exit
的输出。这将运行各种标准 C 清理进程,并导致您的进程以您调用它的状态代码干净地退出。
也许更有趣的是这个问题:“你的进程如何知道何时调用
exit()
?”它是否会收到告诉它何时退出的网络有效负载?您会向它发送 UNIX SIGTERM
信号吗? (如果您觉得这像是误用 SIGTERM
,您可以考虑使用 SIGUSR1
或 SIGUSR2
。)GCD 具有内置信号处理功能(请参阅 DispatchSource.makeSignalSource
此处)。更明确地说,您可以为 SIGTERM
添加一个 GCD 信号处理程序,执行您需要执行的任何其他清理操作,然后在处理程序块的末尾调用 exit()
,这样就可以解决问题。
希望有帮助!