Как обрабатывать выход () в NSOperation - PullRequest
0 голосов
/ 06 апреля 2011

У меня есть исходный код на C для приложения, которое я хочу использовать в своем приложении для iPhone.Я думал, что лучший способ сделать это - вызвать основной метод этого приложения C в подклассе NSOperation.

Это прекрасно работает, за исключением случаев, когда что-то в приложении C работает неправильно и вызывается exit() / abort(), что приводит к срыву всего моего приложения iPHone.

Код на C очень длинный, и я не хочу ни проходить, ни мешать.Я хотел бы знать, могу ли я обойти эти вызовы exit() / abort() в NSOperation, чтобы он просто выходил из потока, а не из всего приложения.

Ответы [ 3 ]

0 голосов
/ 06 апреля 2011

Поскольку вы сами компилируете код C, вы можете добавить свои собственные функции exit() и abort(), тогда код C будет вызывать их, а не те, которые находятся в библиотеке. Определите их, чтобы передать соответствующий статус вашему коду Obj-C и закрыть поток.

Для реальной изоляции, конечно, вы хотите использовать NSTask ...

0 голосов
/ 06 апреля 2011

Я не думаю, что есть какой-то практический способ продолжить после abort(), возможно, такой же для exit().Оба эти вызова на самом деле завершают процесс, что означает, что первоначальный программист, вероятно, не удосужился очистить выделенные ресурсы, дескрипторы файлов и т. Д. Таким образом, даже если вы прервете поток вместо процесса, ваше приложение почти наверняка протечет как ситовсякий раз, когда вызывается переопределенная функция exit () / abort ().

Более серьезно, если программа вызвала abort (), она, вероятно, обнаружила некоторую неисправимую проблему со временем выполнения или ошибкой программиста.Например, переполнение буфера могло повредить кучу.Поэтому может быть невозможно оправиться от ситуации.

Боюсь, вам придется проверять каждое вхождение exit() и abort(), чтобы проверить, можно ли вообще просто прекратить поток.

0 голосов
/ 06 апреля 2011

Как насчет компиляции с опциями -Dexit = my_exit -Dabort = my_abort и реализовать my_exit и my_abort следующим образом?

void my_exit(int status)
{
    if (!/* check thread ID or so forth, and check during calling the NSOperation */) {
        exit(status);
    }
}
...