C Программирование возвращаемого значения vfork

Мне нужно создать программу, которая:

  • попросить номер
  • создать дочерний процесс (используя vfork)
  • вычислить квадратный корень (в дочернем процессе)
  • показать квадратный корень из родительского процесса

Вот мой код

#include <stdio.h>
#include <sys/types.h>
#include <math.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    double n=0;
    printf("Number: "); //ask number
    scanf("%d", &n);

    pid_t pid = vfork(); //create child process

    if (pid==0)//if child process
    {
        printf("Child process started\n");
        n = sqrt(n);//calculate square root
    }
    else//parent process
    {
        printf("Returnning to parent process\n");
    printf("Square Root: %d",n);
    }       

    return 0;
}

Но мой код не работает, кто-нибудь может мне помочь?


person Art Grc    schedule 25.03.2013    source источник
comment
По какой причине вы используете vfork() вместо fork()? vfork() обычно считается устаревшим.   -  person FatalError    schedule 25.03.2013
comment
Кроме того, ваши строки формата в вызовах scanf() и printf() не соответствуют типу n.   -  person FatalError    schedule 25.03.2013


Ответы (2)


Почему вы ожидаете, что это сработает? Выполнение чего-либо, кроме exec или _exit после vfork, приводит к явно неопределенному поведению. Видеть:

системный вызов vfork()

И еще немного об ужасах vfork:

http://ewontfix.com/7/

http://www.openwall.com/lists/musl/2012/12/31/16

Если интересно, вот список возможных проблем с вашей программой (проявления УБ):

  • printf в дочернем элементе может ужасно испортить родительское состояние stdio.
  • n может постоянно храниться в реестре, и в этом случае родитель не сможет увидеть изменения, сделанные дочерним элементом.
  • Компилятор может видеть, что n не инициализирован в ветке else, поэтому ему вообще не нужно генерировать код для его чтения (эта ветвь безоговорочно вызывает UB, обращаясь к объекту, значение которого неопределенно).
person R.. GitHub STOP HELPING ICE    schedule 25.03.2013
comment
как я могу разрешить родителю видеть переменную n у детей? - person Art Grc; 25.03.2013
comment
Вы не можете. Тот факт, что vfork может позволить это, является очень плохим побочным эффектом того, как работает vfork, а не эффектом, который вы должны пытаться использовать. Это по своей сути ненадежно, как я описал выше. Если вы хотите побаловаться подобными вещами, вы должны явно выделить (через mmap) отображение общей памяти, а затем использовать fork или использовать потоки. - person R.. GitHub STOP HELPING ICE; 25.03.2013

Вы вычисляете квадратный корень в дочернем элементе, но пытаетесь напечатать его в родительском. Родитель понятия не имеет, что такое квадратный корень. Если вы хотите, чтобы родитель напечатал квадратный корень, вам нужно каким-то образом передать это значение от дочернего процесса родительскому процессу. Кажется более вероятным, что вы должны печатать квадратный корень в дочернем процессе.

person Caleb    schedule 25.03.2013
comment
OP (или, что более вероятно, невежественный и заблуждающийся инструктор OP) пытается использовать тот факт, что родительский и дочерний элементы совместно используют адресное пространство после vfork, как средство для передачи результата обратно. Это, конечно, не надежно. - person R.. GitHub STOP HELPING ICE; 25.03.2013