退出使用dispatch_main()的命令行Network.framework应用程序

问题描述 投票:0回答:1

在多个平台上使用多种语言使用低级网络代码,我按照 Apple 开发者论坛中的这个示例获得了一个Network.framework示例。

它工作得很好,但由于使用

dispatch_main()
,应用程序永远不会退出回命令行。

文档非常稀疏,示例也不常见,教程几乎不存在。在互联网上搜索时,我发现的只是提到这永远不会返回,但当我真正想返回时,我找不到任何有关如何摆脱它的信息。

我假设这依赖于 GCD(中央调度)和运行循环的背景知识,而我没有而且不容易找到。也许它只与命令行应用程序相关,但大多数 Apple 代码都是针对 GUI 的?

那么有没有办法摆脱/返回

dispatch_main
让我陷入的循环/线程/等?或者,当您打算返回时,除了
dispatch_main
之外,还有其他替代 API 或方法吗?

objective-c macos grand-central-dispatch command-line-tool network.framework
1个回答
1
投票

为此,您可能需要使用 C 函数

void exit(int status);
请参阅
man 3 exit
的输出。这将运行各种标准 C 清理进程,并导致您的进程以您调用它的状态代码干净地退出。

也许更有趣的是这个问题:“你的进程如何知道何时调用

exit()
?”它是否会收到告诉它何时退出的网络有效负载?您会向它发送 UNIX
SIGTERM
信号吗? (如果您觉得这像是误用
SIGTERM
,您可以考虑使用
SIGUSR1
SIGUSR2
。)GCD 具有内置信号处理功能(请参阅
DispatchSource.makeSignalSource
此处)。更明确地说,您可以为
SIGTERM
添加一个 GCD 信号处理程序,执行您需要执行的任何其他清理操作,然后在处理程序块的末尾调用
exit()
,这样就可以解决问题。

希望有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.