2016-06-11 2 views
1

Я написал короткую программу, которая умножает и делит два значения в двух процессах. Проблема возникает в конце приложения, при объединении я хочу результаты умножения и деления.Как использовать fork в C

Код:

#include <stdio.h> 
#include <stdlib.h> 

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

    int iloczyn, a, b; 
    int *w_iloczyn, *w_a, *w_b; 

    float iloraz, suma, result; 
    float *w_iloraz, *w_suma, *w_result; 

    scanf("%d", &a); 
    scanf("%d", &b); 

    w_a = &a; 
    w_b = &b; 

    pid_t id = fork(); 

    if (id == 0) { 

     iloczyn = (*w_a) * (*w_b); 

     w_iloczyn = &iloczyn; 

     printf("%d * %d = %d\n", *w_a, *w_b, *w_iloczyn); 

    } else { 

     int status = 255; 

     id = wait(&status); 

     id = waitpid(id, &status, 0); 

     iloraz = (float) *w_a/(float) *w_b; 
     w_iloraz = &iloraz; 

     printf("%d/%d = %f\n", *w_a, *w_b, *w_iloraz); 
    } 

    printf("Iloczyn: %i\n", *w_iloczyn); 

    printf("Iloraz: %f\n\n", *w_iloraz); 

    return 1; 
} 

В результате того, является нарушением защиты памяти. Что я делаю неправильно?

+3

Процессы не разделяют память. –

+1

Родительский и дочерний процессы имеют отдельные адресные пространства. – jarmod

+2

, если вы хотите обмениваться памятью, вам нужен поток вместо нового процесса –

ответ

3

При использовании fork() результатом являются два отдельных процесса. Они не имеют никакой памяти (технически они делают, но изменения не распространяются), поэтому любые указатели, которые вы используете, недействительны в дочернем процессе.

Таким образом, существует несколько проблем: указатели на локальные переменные могут указывать на совершенно неправильные места, их значения могут не совпадать и значения не возвращаются родительскому процессу, изменяя значения локальных переменных.

1

Вилочные контейнеры новые процессы. С этого момента оба процесса (исходный и новый) меняют другой блок памяти, обращаясь к переменным. Это означает, что в первом процессе переменной w_iloraz никогда не присваивается никакого значения, а во втором процессе ничего не назначено переменной w_iloczyn.

Если вы хотите обмениваться данными между процессами, взгляните на IPC (Inter-process communication). Вы можете использовать общую память (используя функции shmget, shmat, shmdt и т. Д.). Для работы с разделяемой памятью вам необходимо использовать такие функции, как sem_open, sem_wait, sem_post и sem_close.

Вы также можете использовать (неназванные) трубы (см. Man pipe) или именованные каналы (см. Mkfifo).

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