2014-01-21 4 views
0
#include <unistd.h> 
#include <stdio.h> 

static void f1(void); 
static void f2(void); 

int main(void) 
{ 
    printf("process id:%d\n", getpid()); 
    f1(); 
    f2(); 
    _exit(0); 
} 

static void f1(void) 
{ 
    pid_t pid; 

    if((pid = vfork()) < 0) 
    { 
     printf("vfork error\n"); 
    } 
} 
static void f2(void) 
{ 
    char buf[1000]; 
    int i; 

    for(i = 0; i < sizeof(buf); i++) 
    { 
     buf[i] = 0; 
    } 

    printf("f2:process id:%d\n", getpid()); 
} 

Выход выше программы:Почему vfork производит этот выход?

process id:9956 
f2:process id:9957 

Vfork обеспечивает дочерний процесс выполнить перед тем родителем, поэтому я думаю, что при возвращении из функции f1(), дочерний процесс будет выполняться f2(), затем _exit(0); После этого почему родительский процесс не выполняет функцию f2()?

+0

Я могу найти только 'fork()' в вашем примере –

+0

@skwllsp извините, я пропустил набирать vfork .. – Charles0429

ответ

2

Я предполагаю, что вы ошибались fork вместо vfork в вопросе тела. Если это так, вы неправильно используете vfork. Как только вы выдаете vfork, вы ничего не должны делать в ребенке, кроме exec или выходите. Функция

vfork() имеет тот же эффект, что и вилка (2), за исключением того, что поведение не определено, если процесс, созданный vfork() либо изменяет какие-либо другие, чем переменную типа pid_t данные используется для хранения возвращаемого значения из vfork(), или возвращается из функции, в которой вызывалась функция vfork() или вызывала любую другую функцию до успешного завершения , вызывая _exit (2) или одно из семейства exec (3) функций

+0

Вы имеете в виду, что если я использую vfork, то я не должен вызывать какие-либо функции в дочернем процессе? основные утверждения разрешены? – Charles0429

+1

@ Charles0429 Вы можете выполнить exec или вызвать '_exit'. В частности, вы должны стремиться не изменять пространство процессов, так как оно принадлежит родительскому. – cnicutar

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