2015-05-05 4 views
0

В каком направлении проходит эта программа? Мне трудно сменять x.Выход этой программы

int x = 10; 

void handler(sig) { 

    x += 7; 
    return; 

} 

int main(int argc, const char* argv[]) { 

    int pid; 
    signal(SIGCHLD, handler); 
    if ((pid = fork()) == 0) { 
     x -= 3; 
     exit(0); 
    } 
    waitpid(pid, NULL, 0); 
    printf("x = %d\n", x); 
    exit(0); 

} 
+2

Возможно, вы могли бы скомпилировать и выполнить его? – user2182349

+2

Возможно, вы можете уточнить, какую часть программы вы не понимаете. Например, вы понимаете 'fork'? Вы понимаете «сигнал»? и т. д. Какие части вы не понимаете. – kaylum

ответ

0

Какое направление примет эту программу? Мне тяжело после x.

Для того, чтобы проиллюстрировать, что происходит здесь, мы можем добавить еще один вызов printf(), где дочерний процесс выполняет:

int pid; 
signal(SIGCHLD, handler); 
if ((pid = fork()) == 0) { 
    x -= 3; 
    printf("x = %d\n", x); 
    exit(0); 
} 

Что Происходило внутри этой программы, шаг за шагом:

You настройте обработчик сигнала для выполнения, когда завершится дочерний процесс: signal(SIGCHLD, handler).

Написав if ((pid = fork()) == 0), вы выполняете раздел под, если в качестве кода для ребенка (как вы сравниваете результат fork с 0). Более того, forked process наследует значение 10, которое к моменту выполнения кода дочернего процесса равно 10. Затем мы вычитаем 3 из 10:

int pid; 
signal(SIGCHLD, handler); 
if ((pid = fork()) == 0) { 
    x -= 3; 
    printf("x = %d\n", x); 
    exit(0); 
} 

Но это происходит только в дочернем процессе, поэтому при выполнении последней части кода:

waitpid(pid, NULL, 0); 
printf("x = %d\n", x); 

то обработчик выполняется (в родительском процессе), поэтому добавление 7 к 10 (значение x в родительском процессе). Вот почему в конце вы получаете 17.