Результат небольшой C-программы - PullRequest
4 голосов
/ 19 июня 2009

Нам нужно сообщить результат следующей программы на С:

main()
{
    int pid, k, som;
    som = 0; k = 2;
    pid = fork();
    if(pid == 0)
        k=5;
    else
        wait(0);
    for(int i = 1; i <= k; i++)
        som += i;
    printf("%d", som);
}

Мое первое ожидание - 3. Когда выполняется вызов fork, память процесса копируется, и обе программы запускаются. Затем выполняется дочерний процесс, но k по-прежнему равен 2. Таким образом, в конце он выполняет 1 + 2 = 3;

Но когда эта программа выполняется, она выдает 153. У меня нет ближайшей подсказки, почему она выводит это.

Кто-нибудь может сказать, почему?

Ответы [ 4 ]

15 голосов
/ 19 июня 2009

Причина, по которой вы печатаете 2 процесса на одной консоли. "fork" - это команда unix / linux, которая вызывается один раз и возвращает дважды. Одно из возвращений будет в исходном процессе, который вызвал fork, и вернет PID дочернего процесса, который был создан. Второе возвращение будет 0, и это означает, что это дочерний процесс.

Одна из программ, которую я считаю дочерней, запускается первой, вычисляет 15 как значение и печатает его на консоли последним. Родительская программа выполняет секунду из-за wait (0) и выдает значение 3.

4 голосов
/ 19 июня 2009

15 печатается дочерним, а 3 родительским.

2 голосов
/ 19 июня 2009

A родительский, B дочерний, вот важные строки:

A: pid = fork(); // returns 0 for the child process
A: wait(0);
B: k = 5;
B: for(int i = 1; i <= k; i++) som += i; // som = 15
B: printf("%d", som); // prints 15, B finishes, goes back to A
A: for(int i = 1; i <= k; i++) som += i; // som = 3
A: printf("%d", som); // prints 3
0 голосов
/ 19 июня 2009

Между значениями не печатается новая строка, поэтому ответ родителя появляется сразу после ответа ребенка.

Джаред прав насчет причины значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...