task_set_bootstrap_port в parent приводит к зависанию дочернего элемента - PullRequest
2 голосов
/ 17 августа 2011

Поведение 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.

1 Ответ

2 голосов
/ 29 августа 2011

Служба технической поддержки Apple Developer сообщает, что временное изменение порта начальной загрузки, как это делал этот код, никогда не гарантировало работоспособности.В этом случае XPC пытался сообщать порт boostrap после того, как он был изменен, и это не удавалось, поэтому все сломалось.

Быстрое решение заключается в использовании bootstrap_register (хотя и не рекомендуется) в родительском процессе и bootstrap_look_up в дочернем.Это позволяет ребенку искать родителя по имени (строке) и получать от него порт.

...