面试题答案
一键面试文件描述符在父子进程间跨进程使用的基本原理
- 文件描述符表:每个进程都有自己独立的文件描述符表,该表记录了进程打开的所有文件的相关信息。当一个进程打开一个文件时,系统会在文件描述符表中分配一个空闲的文件描述符,并返回给进程。
- 共享内核文件表项:虽然每个进程有独立的文件描述符表,但多个进程打开同一个文件时,它们的文件描述符会指向内核中的同一个文件表项。这个文件表项记录了文件的当前读写位置、访问权限等信息。
- fork原理:当使用
fork
函数创建子进程时,子进程会复制父进程的地址空间,包括文件描述符表。这意味着子进程的文件描述符表中的项与父进程的文件描述符表中的项指向相同的内核文件表项。所以父子进程可以共享文件描述符,对同一个文件进行操作。
通过fork函数实现文件描述符在父子进程间的共享关键代码片段
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
int main() {
int fd;
// 打开文件
fd = open("test.txt", O_CREAT | O_WRONLY | O_TRUNC, 0644);
if (fd == -1) {
perror("open");
return 1;
}
pid_t pid = fork();
if (pid == -1) {
perror("fork");
close(fd);
return 1;
} else if (pid == 0) {
// 子进程
const char *child_msg = "This is from child process\n";
write(fd, child_msg, strlen(child_msg));
close(fd);
exit(0);
} else {
// 父进程
const char *parent_msg = "This is from parent process\n";
write(fd, parent_msg, strlen(parent_msg));
wait(NULL); // 等待子进程结束
close(fd);
}
return 0;
}
在上述代码中:
- 首先使用
open
函数打开一个文件,得到文件描述符fd
。 - 然后通过
fork
函数创建子进程。 - 父子进程都可以使用这个共享的文件描述符
fd
对文件进行写入操作。 - 操作完成后,父子进程都关闭文件描述符。父进程通过
wait
函数等待子进程结束,避免产生僵尸进程。