如何在C中使用fork

时间:2016-06-11 13:57:33

标签: c fork

我写了一个简短的程序,在两个进程中将两个值相乘和除。 问题出现在应用程序的最后,当加在一起时,我想要乘法和除法的结果。

代码:

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

添加的结果违反了内存保护。 我做错了什么?

2 个答案:

答案 0 :(得分:3)

使用fork()时,结果是两个独立的进程。它们不共享任何内存(技术上它们会共享但不会传播),因此您使用的任何指针都必然在子进程中无效。

所以有几个问题:指向局部变量的指针可能指向完全错误的位置,它们的值可能不匹配,并且没有值通过更改局部变量的值返回到父进程。

答案 1 :(得分:1)

分叉新工艺。从那时起,两个进程(原始进程和新进程)通过访问变量来更改不同的内存块。这意味着,在变量w_iloraz的第一个过程中永远不会赋值任何值,而在第二个过程中没有赋值给变量w_iloczyn。

如果要在进程之间共享数据,请查看IPC(进程间通信)。 您可以使用共享内存(使用shmget,shmat,shmdt等函数)。您需要使用sem_open,sem_wait,sem_post和sem_close等函数来处理共享内存。

您还可以使用(未​​命名)管道(请参阅man pipe)或命名管道(请参阅mkfifo)。