我写了一个简短的程序,在两个进程中将两个值相乘和除。 问题出现在应用程序的最后,当加在一起时,我想要乘法和除法的结果。
代码:
#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;
}
添加的结果违反了内存保护。 我做错了什么?
答案 0 :(得分:3)
使用fork()
时,结果是两个独立的进程。它们不共享任何内存(技术上它们会共享但不会传播),因此您使用的任何指针都必然在子进程中无效。
所以有几个问题:指向局部变量的指针可能指向完全错误的位置,它们的值可能不匹配,并且没有值通过更改局部变量的值返回到父进程。
答案 1 :(得分:1)
分叉新工艺。从那时起,两个进程(原始进程和新进程)通过访问变量来更改不同的内存块。这意味着,在变量w_iloraz的第一个过程中永远不会赋值任何值,而在第二个过程中没有赋值给变量w_iloczyn。
如果要在进程之间共享数据,请查看IPC(进程间通信)。 您可以使用共享内存(使用shmget,shmat,shmdt等函数)。您需要使用sem_open,sem_wait,sem_post和sem_close等函数来处理共享内存。
您还可以使用(未命名)管道(请参阅man pipe)或命名管道(请参阅mkfifo)。