C语言中调用fork()后字符数组会被复制吗?
在C语言中调用fork()后字符数组是否会被复制?
你的代码输出会是第二种情况:
The message in child is secret message
The message in parent is empty message
原因解析:
当调用fork()创建子进程时,系统会为子进程创建父进程地址空间的**写时复制(Copy-On-Write)**副本。这意味着:
- 初始状态下,父子进程共享同一块内存空间(包括栈上的
msg字符数组),不会立即复制。 - 当任意一方尝试修改内存内容时,系统才会为修改的内存区域创建独立的副本,确保修改只影响当前进程。
回到你的代码:
- 父进程初始化
msg为"empty message",然后调用fork()。 - 子进程进入
else分支,执行strcpy(msg, "secret message")——这一修改触发了写时复制,系统为子进程的msg数组创建独立副本,修改的只是子进程自己的这份数据。 - 父进程在
wait(0)等待子进程结束后,打印的是自己未被修改的msg,也就是初始的"empty message"。
完整代码:
#include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/wait.h> int main() { char msg[50] = "empty message"; pid_t pid = fork(); if(pid > 0) { wait(0); printf("The message in parent is %s\n", msg); } else { strcpy(msg, "secret message"); printf("The message in child is %s\n", msg); } return 0; }
实际输出:
The message in child is secret message The message in parent is empty message
内容的提问来源于stack exchange,提问作者Dogu Deniz Ugur
相关产品推荐
相关产品推荐

