如何在C中使用fork

如何在C中使用fork,c,fork,C,Fork,我写了一个简短的程序,在两个过程中对两个值进行乘法和除法。 这个问题发生在应用程序的末尾,当将它们相加时,我需要乘法和除法的结果 代码: 添加的结果违反了内存保护。 我做错了什么?使用fork时,结果是两个独立的进程。从技术上讲,它们不共享任何内存,但更改不会传播,因此您使用的任何指针在子进程中都是无效的 因此存在几个问题:指向局部变量的指针可能指向完全错误的位置,它们的值可能不匹配,并且通过更改局部变量的值不会将任何值返回到父进程 使用fork时,结果是两个独立的进程。从技术上讲,它们不共享任

我写了一个简短的程序,在两个过程中对两个值进行乘法和除法。 这个问题发生在应用程序的末尾,当将它们相加时,我需要乘法和除法的结果

代码:

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

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

因此存在几个问题:指向局部变量的指针可能指向完全错误的位置,它们的值可能不匹配,并且通过更改局部变量的值不会将任何值返回到父进程

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


因此存在几个问题:指向局部变量的指针可能指向完全错误的位置,它们的值可能不匹配,并且通过更改局部变量的值不会将任何值返回到父进程

叉箱新工艺。从那一刻起,原始和新进程都通过访问变量来改变不同的内存块。这意味着,在第一个过程中,变量w_iloraz从未被赋值,而在第二个过程中,变量w_iloczyn没有被赋值

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


您还可以使用未命名管道(请参见人工管道)或命名管道(请参见mkfifo)。

分叉板条箱新流程。从那一刻起,原始和新进程都通过访问变量来改变不同的内存块。这意味着,在第一个过程中,变量w_iloraz从未被赋值,而在第二个过程中,变量w_iloczyn没有被赋值

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


您也可以使用未命名的管道参见人管,或命名管道请参阅mkfifo。

进程不共享内存。父进程和子进程有单独的地址空间。如果要共享内存,则需要线程而不是新进程。进程不共享内存。父进程和子进程有单独的地址空间。如果要共享内存,则需要线程而不是新进程
#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;
}