Поведение task_set_bootstrap_port
изменилось между OS X 10.6 и 10.7.В 10.6 это сработало:
// parent process
mach_port_t parent_recv_port = MACH_PORT_NULL;
setup_recv_port (&parent_recv_port);
task_set_bootstrap_port(mach_task_self(), parent_recv_port);
NSTask *qtTask = [[NSTask alloc] init];
[qtTask setLaunchPath:...];
[qtTask launch];
...
// child process
int main (int argc, const char * argv[])
{
mach_port_t parent_recv_port = MACH_PORT_NULL;
task_get_bootstrap_port(mach_task_self(), &parent_recv_port);
...
}
Однако в 10.7 дочерний процесс не выполняет первую строку main
сразу после того, как родительский вызов -launch
- этоожидает завершения родительского процесса.(Хотя дочерний процесс действительно сразу появляется в ps
.)
Я сузил проблему до вызова task_set_bootstrap_port
.Когда вызов отсутствует, дочерний процесс не зависает.И, если сразу после task_set_bootstrap_port
-
task_set_bootstrap_port(mach_task_self(), bootstrap_port);
восстановить исходный порт начальной загрузки, дочерний процесс также не зависнет.
Код обработки ошибок был опущен сверху, но в действительности он проверяет ошибки после каждого вызова.Нет ошибок
Итак, есть идеи, почему поведение task_set_bootstrap_port
изменилось с 10,6 до 10,7?И есть ли обходной путь?
Ограничения:
- Требуется доступ к
mach_port_t
для перехода к IOSurfaceLookupFromMachPort
. - Runloop может не существовать, поэтому не может использовать
NSMachPort
или CFMachPort
.