gpt4 book ai didi

objective-c - 确保在 Cocoa 应用程序退出之前执行 Objective-C 代码

转载 作者:太空狗 更新时间:2023-10-30 03:49:00 24 4
gpt4 key购买 nike

假设一个 Cocoa 应用程序必须在退出之前执行一些非常重要的 Objective-C 操作(无论出于何种原因——崩溃或退出)。

是否有可能确保执行任意 objective-c 代码以响应每个崩溃事件? (SIGINTSIGBUSSIGSEGV 等,忽略“不可捕获”(SIGSTOPSIGKILL、闪电等))


It would be helpful to know what your hooks are trying to do.

例如:假设应用程序要运行,它绝对必须更改某个可变的系统范围配置变量 X 的值。在启动时,应用程序拍摄 X 的当前状态的快照,然后对其进行修改。当应用程序成功退出时,它只是将 X 恢复为终止前隐藏的原始值。我的问题是:是否可以确保即使应用程序崩溃也能恢复 X?

最佳答案

不,没有办法保证任何给定的代码片段将在应用程序终止时准确执行,因为用户可能以应用程序无法捕获的方式终止应用程序(例如,拔下插头在台式机上)。

您的代码绝对必须针对意外终止进行强化

您需要加强多少取决于您的应用程序。在基于文档的应用程序中(在现代自动保存频繁模型之前),上次保存后丢失数据是意料之中的(而且很烦人)。

对于您的应用,您需要平衡持久性成本与持久化数据的值(value)。


I'm only interested in the termination signals that can be caught.

“可以被捕获”和“可以做任何有用的事”是有区别的。正如您所指出的,可以捕获许多信号。

但是,您实际上不能在信号处理程序中执行任何操作。从技术上讲,您甚至无法分配内存。

此外,通常会生成信号或异常,因为应用程序已进入未定义的、灾难性损坏的状态。因此,您不能指望应用程序中的任何内部状态可用。

我见过很多这样的情况,当发生崩溃时,应用程序会尝试保存用户状态,只是为了非常愉快地写入损坏的状态,最终导致用户丢失更多数据。

了解您的钩子(Hook)试图做什么会很有帮助。


有关更多信息,请参阅 sigaction 手册页。

具体来说,可以安全调用的函数列表包括 _exit()、access()、alarm()、cfgetispeed()、cfgetospeed()、cfsetispeed()、cfsetospeed()、chdir()、chmod() , chown(), close(), creat(), dup(), dup2(), execle(), execve(), fcntl(), fork(), fpathconf(), fstat(), fsync(), getegid (), geteuid(), getgid(), getgroups(), getpgrp()、getpid()、getppid()、getuid()、kill()、link()、lseek()、mkdir()、mkfifo()、open()、pathconf()、pause()、pipe( ), raise(), read(), rename(), rmdir(), setgid(), setpgid(), setsid(), setuid(), sigaction(), sigaddset(), sigdelset(), sigemptyset(), sigfillset()、sigismember()、signal()、sigpending()、sigprocmask()、sigsuspend()、sleep()、stat()、sysconf()、tcdrain()、tcflow()、tcflush()、tcgetattr( ), tcgetpgrp(), tcsendbreak(), tcsetattr(), tcsetpgrp(), time(), times(), umask(), uname(), unlink(), utime(), wait(), waitpid(), write(), aio_error(), sigpause(), aio_return(), aio_suspend(), sem_post(), sigset(), strcpy(), strcat(), strncpy(), strncat( )、strlcpy() 和 strlcat()。

所有不在上述列表中的函数都被认为是不安全的信号。也就是说,当从信号处理程序调用时,此类函数的行为是未定义的。不过,一般来说,信号处理程序应该做的只是设置一个标志;大多数其他操作都不安全。

翻译:你真的不能在信号处理程序中做很多有用的事情。

Mpte a;sp tjat sogma; ,au ne de;overed pm amu tjread amd ,ogjt ne de;overed nu interrupting a currently executing function.

我要输入的内容:请记住,信号处理程序可能会在随机线程上交付,也可能会中断当前正在执行的函数。 IE。您的应用程序的状态可能有些不确定。

关于objective-c - 确保在 Cocoa 应用程序退出之前执行 Objective-C 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12663842/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com