2012-07-02 2 views
0

Является ли ребенок, после вилки, запускать программу с самого начала или с места родителя?fork: где ребенок запускается?

например, это эта программа, является ли ребенок начинаться с строки 1 или строки 3?

int i=1 
fork() 
i=i*2 
fork 
i=i*2 
+1

Процесс дочернего процесса и родительский процесс почти одинаковы после форкирования, что означает, что как дочерний, так и родительский будут продолжать выполнение из строки после 'fork()'. – nhahtdh

+0

Этот вопрос сформулирован с чрезвычайно низким качеством. Пожалуйста, подумайте о том, чтобы взять еще 10 секунд, когда мы что-то спросили. –

+1

Итак, вместо того, чтобы брать то же самое время, сколько потребовалось, чтобы написать этот вопрос, вам не удалось выполнить самую основную отладку printf(), которая ответила бы на этот вопрос? Вот код: int main (void) {printf ("start \ n"); switch (fork()) {case 0: printf ("forked process \ n"); ломать; default: printf ("parent process \ n"); break;} exit (0); } – tbert

ответ

0

Вилка начинается с линии 3, точки, где произошла вилка.

6

вилка() создает новый процесс, дублируя вызывающий процесс. Новый процесс, называемый как ребенок, является точной копией вызывающего процесса, называют в качестве родителя, для следующих замечаний: [...]

из 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 . Не забавно.)

0

Когда fork возвращается, он возвращается как в родительском (возвращающем PID дочернего элемента), так и в дочернем элементе (возвращается 0). Выполнение продолжается оттуда как у родителя, так и у ребенка.

В качестве такого, типичного использования вилки что-то вроде:

if (0 == (child = fork())) 
    // continue as child. 
else 
    // Continue as parent. 
0

Child будет создан в строке 2, т.е. fork(), но он начнет его исполнение от линии 3, т.е. i = i*2. Что меня смущает, так это ваша линия 4. Что вы пытаетесь сделать там?

+0

Я думаю, он пытается «fork()' 'снова в строке 4, возможно, он забыл браки. – doniyor

+2

Это ошибка в C :-) – Abhineet

+1

да, большая ошибка! : D – doniyor

Смежные вопросы