int main (int argc, char **argv) {
int retval;
printf("Это определенно родительский процесс\n");
fflush(stdout);
retval = fork();
printf("Кто это сказал?\n");
return (EXIT_SUCCESS);
}
После вызова
Это определенно родительский процесс
Кто это сказал?
Кто это сказал?
Иными словами, оба процесса выведут вторую строку.
Существует только один способ различить эти два процесса — он заключается в использовании возвращаемого функцией
Китайская грамота, да? Проясним этот момент еще одним фрагментом программы:
printf("PID родителя равен %d\n", getpid());
fflush(stdout);
if (child_pid = fork()) {
printf("Это родитель, PID сына %d\n", child_pid);
} else {
printf("Это сын, PID %d\n", getpid());
}
Эта программа выведет на экран примерно следующее:
PID родителя равен 4496
Это родитель, PID сына 8197
Это сын, PID 8197
Таким образом, после применения функции
Применение функции
Функция
Предположим, что у вас есть процесс, и вы еще не создали никаких потоков (т.е., вы работаете с одним потоком — тем, который вызвал функцию
Это был простейший пример.
Теперь предположим, что в вашем процессе вы вызвали
Вы можете верить этому или нет, но это POSIX-совместимая ситуация. POSIX утверждает, что функция
Такая реализация была сделана преднамеренно, и причина этого кроется в потоках и мутексах. Если бы этого ограничения не было (и оно может быть снято в будущих версиях QNX/ Neutrino), то вновь созданный процесс, как и предполагается, имел бы то же самое число потоков, что и исходный. Однако, тут возникает сложность, потому что некоторые из исходных потоков могут являться владельцами мутексов. Поскольку вновь создаваемый процесс имеет ту же область данных, что и исходный, библиотека должна была бы отслеживать, какие мутексы принадлежат каким потокам в исходном процессе, и затем дублировать принадлежность мутексов в новом процессе. Это не является невозможным: есть функция, называемая
Очевидно, если вы переносите в QNX/Neutrino программу из другой ОС, вы пожелаете использовать те же механизмы, что и в исходной программе. Я бы посоветовал избегать в новом коде применения функции
• функция