2016-06-11 12 views
1

Ich schrieb ein kurzes Programm, das zwei Werte in den zwei Prozessen multipliziert und teilt. Das Problem tritt am Ende der Anwendung auf, wenn addiert, will ich die Ergebnisse der Multiplikation und Division.Wie man Gabel in C benutzt

Code:

#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; 
} 

Das Ergebnis der Addition ist eine Verletzung des Speicherschutzes. Was mache ich falsch?

+3

Prozesse teilen keinen Speicher. –

+1

Die übergeordneten und untergeordneten Prozesse haben separate Adressräume. – jarmod

+2

Wenn Sie Speicher freigeben möchten, benötigen Sie einen Thread anstelle eines neuen Prozesses –

Antwort

3

Wenn Sie fork() verwenden, ist das Ergebnis zwei separate Prozesse. Sie teilen keinen Speicher (technisch tun sie, aber Änderungen verbreiten sich nicht), also sind alle Zeiger, die Sie verwenden, im Kindprozess nicht notwendigerweise gültig.

Es gibt also mehrere Probleme: Die Zeiger auf lokale Variablen können auf völlig falsche Stellen zeigen, ihre Werte stimmen möglicherweise nicht überein und es werden keine Werte an den übergeordneten Prozess zurückgegeben, indem die Werte der lokalen Variablen geändert werden.

1

Gabelkiste neue Prozesse. Von diesem Moment an ändern beide Prozesse (der ursprüngliche und der neue) verschiedene Speicherblöcke, indem sie auf die Variablen zugreifen. Das bedeutet, dass im ersten Prozess der Variablen w_iloraz niemals ein Wert zugewiesen wird und im zweiten Prozess der Variablen w_iloczyn nichts zugewiesen wird.

Wenn Sie Daten zwischen Prozessen teilen möchten, sehen Sie sich IPC (Interprozesskommunikation) an. Sie können Shared Memory verwenden (mit den Funktionen shmget, shmat, shmdt usw.). Sie müssen Funktionen wie sem_open, sem_wait, sem_post und sem_close verwenden, um mit gemeinsam genutztem Speicher zu arbeiten.

Sie können auch (unbenannte) Pipes (siehe man pipe) oder Named Pipes (siehe mkfifo) verwenden.