57 lines
2.3 KiB
C
57 lines
2.3 KiB
C
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
#include <unistd.h>
|
||
#include <sys/types.h>
|
||
|
||
static int vax = 18; // 静态全局变量
|
||
int var = 10; // 全局变量
|
||
int main(int argc, char const *argv[])
|
||
{
|
||
pid_t pid;
|
||
int num = 9; // 局部变量
|
||
pid = fork(); // 创建子进程
|
||
if (pid < 0)
|
||
{
|
||
perror("fork");
|
||
}
|
||
if (pid == 0) // 子进程
|
||
{
|
||
vax--; // 子进程中修改静态全局变量 vax
|
||
var++; // 子进程中修改全局变量 var
|
||
num++; // 子进程中修改局部变量 num
|
||
printf("在子进程的 vax=%d, var=%d, num=%d\n", vax, var, num);
|
||
}
|
||
else // 父进程
|
||
{
|
||
sleep(1); // 父进程等待一秒钟
|
||
printf("在父进程的 vax=%d, var=%d, num=%d\n", vax, var, num);
|
||
}
|
||
|
||
printf("命令代码区\n"); // 在父进程和子进程中都会执行的代码
|
||
|
||
return 0;
|
||
}
|
||
|
||
/*
|
||
这段代码创建了一个子进程,并在父进程和子进程中分别修改和打印变量 var 和 num 的值。下面是代码的执行过程:
|
||
|
||
主进程开始执行,变量 var 被初始化为 10,变量 num 被初始化为 9。
|
||
调用 fork() 创建子进程。
|
||
在父进程中,fork() 返回子进程的进程ID,所以 pid 不为0,进入父进程的分支。
|
||
父进程调用 sleep(1) 休眠一秒钟,让子进程先执行。
|
||
在子进程中,fork() 返回0,进入子进程的分支。
|
||
子进程中,var++ 将全局变量 var 的值加1,num++ 将局部变量 num 的值加1。
|
||
子进程打印输出 "在子进程的 var=11, num=10"。
|
||
父进程等待一秒钟后恢复执行,继续执行下面的代码。
|
||
父进程打印输出 "在父进程的 var=10, num=9"。
|
||
打印输出 "命令代码区"。
|
||
程序结束。
|
||
*/
|
||
|
||
/*
|
||
由于 fork() 创建了一个子进程,子进程会复制父进程的内存空间,包括变量的值。因此,父进程和子进程拥有各自独立的变量副本,它们的修改互不影响。
|
||
|
||
在子进程中,变量 var 的值被增加到 11,而变量 num 的值被增加到 10。在父进程中,变量 var 保持为初始值 10,变量 num 保持为初始值 9。这说明父进程和子进程中的变量是独立的。
|
||
|
||
最后的打印输出语句 "命令代码区" 在父进程和子进程中都会执行,因为它们是在 fork() 调用之前执行的代码。
|
||
*/ |