一般来说,子进程调用close()不会发生什么。close()函数关闭文件时,并不是在任何情况下都直接关闭文件,而是找出struct file结构体中f_count成员,执行自减操作;直到f_count为0,才是真正的关闭文件。这就是著名的技术——引用计数。
#include<stdio.h> //printf()打印输出
#include<stdlib.h> //exit()结束进程
#include<assert.h> //assert()断言
#include<unistd.h> //宏
#include<fcntl.h> //I/O函数
void main()
{
int i = 0; //遵循C89标准,所有变量必须在main函数开始处进行声明
int fd = open(“./a.txt”,O_RDONLY); //以只读的方式打开,返回文件描述符
int num = 0;
char buff[11]={0};
if(fd == -1)
{
printf(“Open a.txt failure in reading!”);
exit(1); //不正常退出
}
pid_t n = fork();
if(n == 0)
{
close(fd);
}
else
{
sleep(10);
while(1)
{
num = read(fd, buff + i*5, 5);
if(num <= 0)
break;
++i;
}
printf(“%s\n”, buff);
}
exit(0); //正常退出
}
![](https://i-blog.csdnimg.cn/blog_migrate/76de9bb2e4adb41f1cb1612c65ac8367.png)
这个小实验的目的就是为了验证close()函数的效果。 父进程创建出子进程后,两个进程就是独立的个体,各自运行,互不干扰。父子进程谁先运行不由fork()决定,由系统当前环境和调度算法决定。