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