1.利用fork创建子进程,验证局部变量、全局变量和malloc动态申请的变量在父子进程中的使用情况。
时间: 2023-05-19 20:06:03 浏览: 173
当使用fork创建子进程时,子进程会复制父进程的内存空间,包括局部变量和全局变量。但是,由于子进程是父进程的副本,它们各自拥有自己的内存空间,因此它们的变量是独立的。对于malloc动态申请的变量,它们在父子进程中的使用情况也是相互独立的。
下面是一个简单的示例代码,可以验证这些情况:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int global_var = 10;
int main() {
int local_var = 20;
int *heap_var = (int*)malloc(sizeof(int));
*heap_var = 30;
pid_t pid = fork();
if (pid == 0) {
// Child process
printf("Child process:\n");
printf("global_var = %d\n", global_var);
printf("local_var = %d\n", local_var);
printf("*heap_var = %d\n", *heap_var);
global_var = 20;
local_var = 30;
*heap_var = 40;
printf("After modification:\n");
printf("global_var = %d\n", global_var);
printf("local_var = %d\n", local_var);
printf("*heap_var = %d\n", *heap_var);
free(heap_var);
} else if (pid > 0) {
// Parent process
printf("Parent process:\n");
printf("global_var = %d\n", global_var);
printf("local_var = %d\n", local_var);
printf("*heap_var = %d\n", *heap_var);
global_var = 30;
local_var = 40;
*heap_var = 50;
printf("After modification:\n");
printf("global_var = %d\n", global_var);
printf("local_var = %d\n", local_var);
printf("*heap_var = %d\n", *heap_var);
free(heap_var);
} else {
// Error
printf("Error: fork failed.\n");
return 1;
}
return 0;
}
在这个示例中,我们定义了一个全局变量global_var,一个局部变量local_var和一个动态申请的变量heap_var。在主函数中,我们分别将它们初始化为10、20和30。然后,我们使用fork创建了一个子进程。
在子进程中,我们首先打印出了这三个变量的值,然后修改了它们的值,并再次打印出了它们的值。在父进程中,我们也做了同样的操作。
如果我们运行这个程序,它的输出应该是这样的:
Parent process:
global_var = 10
local_var = 20
*heap_var = 30
After modification:
global_var = 30
local_var = 40
*heap_var = 50
Child process:
global_var = 10
local_var = 20
*heap_var = 30
After modification:
global_var = 20
local_var = 30
*heap_var = 40
可以看到,父子进程中的全局变量global_var的值是相同的,但是局部变量local_var和动态申请的变量heap_var的值是不同的。这证明了在fork创建子进程时,全局变量是共享的,但是局部变量和动态申请的变量是独立的。
阅读全文