Является ли ребенок, после вилки, запускать программу с самого начала или с места родителя?fork: где ребенок запускается?
например, это эта программа, является ли ребенок начинаться с строки 1 или строки 3?
int i=1
fork()
i=i*2
fork
i=i*2
Является ли ребенок, после вилки, запускать программу с самого начала или с места родителя?fork: где ребенок запускается?
например, это эта программа, является ли ребенок начинаться с строки 1 или строки 3?
int i=1
fork()
i=i*2
fork
i=i*2
Вилка начинается с линии 3, точки, где произошла вилка.
вилка() создает новый процесс, дублируя вызывающий процесс. Новый процесс, называемый как ребенок, является точной копией вызывающего процесса, называют в качестве родителя, для следующих замечаний: [...]
из fork(2)
As это точный дубликат, он также будет иметь один и тот же указатель и стек. Таким образом, ребенок будет сразу после звонка до fork()
. Теперь вы можете спросить, как узнать, является ли текущая программа дочерним или родительским? Обратитесь к странице справочника на возвращаемом значении:
В случае успеха, PID дочернего процесса возвращается в родителе, и 0 возвращаются в дочернем. При ошибке -1 возвращается в родительском , никакого дочернего процесса не создается, а errno устанавливается соответствующим образом.
Так что, если результат fork()
равно 0
, вы в дочернем процессе, если его больше, чем 0
вы в родительском, и если его ниже 0
вы в беде.
Обратите внимание, что это означает, что каждый код, который не зависит от значения результата fork()
, будет выполнен в как дочерним, так и родительским. Так что, если вы, например, создание пула с 16 процессов, вы должны делать:
for (int i = 0; i < 16; i++) {
pid_t pid = fork()
if (pid == 0) {
do_some_work();
exit(0);
} else if (pid < 0) {
// fork failed
do_some_error_handling();
}
}
Если вы пропустите exit(0)
, вы будете появляться 2¹⁶-1 процессы (были там, только с 100 вместо 16 . Не забавно.)
Когда fork возвращается, он возвращается как в родительском (возвращающем PID дочернего элемента), так и в дочернем элементе (возвращается 0). Выполнение продолжается оттуда как у родителя, так и у ребенка.
В качестве такого, типичного использования вилки что-то вроде:
if (0 == (child = fork()))
// continue as child.
else
// Continue as parent.
Child
будет создан в строке 2, т.е. fork()
, но он начнет его исполнение от линии 3, т.е. i = i*2
. Что меня смущает, так это ваша линия 4. Что вы пытаетесь сделать там?
Процесс дочернего процесса и родительский процесс почти одинаковы после форкирования, что означает, что как дочерний, так и родительский будут продолжать выполнение из строки после 'fork()'. – nhahtdh
Этот вопрос сформулирован с чрезвычайно низким качеством. Пожалуйста, подумайте о том, чтобы взять еще 10 секунд, когда мы что-то спросили. –
Итак, вместо того, чтобы брать то же самое время, сколько потребовалось, чтобы написать этот вопрос, вам не удалось выполнить самую основную отладку printf(), которая ответила бы на этот вопрос? Вот код: int main (void) {printf ("start \ n"); switch (fork()) {case 0: printf ("forked process \ n"); ломать; default: printf ("parent process \ n"); break;} exit (0); } – tbert