2010-09-01 2 views
3

Поддерживает ли iPhone SDK fork() и pipe(), традиционные функции unix? Я не могу заставить их работать.Вилка() на iPhone

Редактировать

Проблема решена. Здесь я предлагаю решение любому, кто сталкивается с подобными мне проблемами. Я был вдохновлен ответами в этой теме.

В iPhone нет способа разблокировать процесс. Однако реализовать трубопровод невозможно. В моем проекте я создаю новый поток POSIX (прочитайте документацию Apple, как это сделать). В дочернем потоке будет использоваться файловый дескриптор, созданный pipe() с родительским потоком. Реальные и родительские потоки могут связываться через каналы. Например, мой дочерний поток dup2() fd [1] до его стандартного вывода. Таким образом, любой стандартный вывод может быть обнаружен в родительском потоке. Аналогично fd [0] и стандартного ввода.

псевдокод (я не имею код доступен, но вы получите идею):

int fd[2]; 
pipe(fd); 
create_posix_thread(&myThread, fd); 
char buffer[1024]; 
read(fd[0], buffer, 1024); 
printf("%s", buffer); // == "Hello World"  

void myThread(int fd[]) 
{ 
    dup2(fd[1], STANDARD_OUTPUT); 
    printf("Hello World"); 
} 

Стратегия очень удобно, если вы хотите использовать сторонние библиотеки в приложении iPhone. Однако проблема заключается в том, что стандартная отладка с использованием printf() больше недоступна. В моем проекте я просто перенаправил все отладочные выходы на стандартную ошибку, XCode отобразит выходы на свою консоль.

ответ

6

Вы не можете использовать fork(), но можете использовать столько потоков, сколько хотите, и теперь у вас даже есть GCD на iPhone, чтобы помочь поддерживать поток в разумных пределах.

Почему вы хотите fork() вместо использования большего количества потоков?

+0

Вы правы. Я пытался использовать fork(), потому что это была стандартная практика в UNIX. Кроме того, если мы напечатаем f() в другом процессе, это не повлияет на дочерний процесс. iPhone не позволяет этого, поэтому я решил переключиться на несколько потоков. – SmallChess

4

Nope. Вы также не можете выполнить exec. У вас есть 1 процесс.