编写一个程序,调用fork()函数,子进程和父进程都可以访问open()系统调用返回的文件描述符吗?当父子进程并发写入文件时,会发生什么? 【给出完整代码,调试截图及运行结果,并回答问题】
时间: 2024-12-16 13:22:30 浏览: 12
在Unix/Linux系统中,`fork()`函数用于创建一个新的进程,新进程(称为子进程)拥有与原进程几乎完全相同的环境,包括打开的文件描述符。因此,父进程和子进程都可以访问`open()`操作返回的文件描述符。
下面是一个简单的C语言示例,展示了如何在父进程和子进程中同时写入同一个文件:
```c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main(int argc, char *argv[]) {
int fd = open("shared_file.txt", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); // 创建并打开文件
if (fd == -1) { // 检查是否成功打开
perror("Failed to open file");
return 1;
}
pid_t pid = fork(); // 创建子进程
if (pid == 0) { // 子进程部分
printf("Child process writing...\n");
write(fd, "Hello from child\n", sizeof("Hello from child"));
} else if (pid > 0) { // 父进程部分
printf("Parent process writing...\n");
write(fd, "Hello from parent\n", sizeof("Hello from parent"));
} else { // fork失败
perror("Failed to fork");
return 1;
}
close(fd); // 关闭文件描述符,防止资源泄露
wait(NULL); // 等待子进程结束
return 0;
}
```
当你运行这个程序时,两个进程会各自写入"Hello from child"和"Hello from parent"到名为"shared_file.txt"的文件中。由于它们共享了同一个文件描述符,可能会导致数据交错,除非你采取额外措施来同步或者使用锁来控制对文件的操作。
**相关问题--:**
1. 如何避免父子进程写入文件时的数据冲突?
2. `wait()`函数的作用是什么?
3. 如果不关闭文件描述符,会有哪些潜在问题?
阅读全文