#include #include #include #include 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() 调用之前执行的代码。 */