close函数关闭一个已打开的文件。
#include <unistd.h>
int close(int fd);
返回值:成功返回0,出错返回-1并设置errno
参数fd是要关闭文件描述符。当一个进程终止时,内核对该进程所有尚未关闭的文件描述符调用close关闭,所以即使用户程序不调用close,在终止时内核也会自动关闭它打开的所有文件。
由open返回的文件描述符一定是该进程尚未使用的最小的描述符。
代码演示如下:
#include "./common/head.h"
/*功能:
*创建文件1、文件2,关闭文件1,创建文件3,验证fd是否一直为最小的文件描述符。
*/
int main(int argc, char **argv)
{
if(argc != 4){ //./a.out file1 file2 file3
printf("usage: cmd file1 file2 file3\n");
exit(1);
}
int fd1, fd2, fd3;
fd1 = open(argv[1], O_RDWR | O_CREAT, 0777); //文件权限不一定是077,还与掩码umask有关系
if(fd1 < 0){
perror("OPEN1");
exit(1);
}else{
printf("fd1 = %d\n", fd1); //3。由于0、1、2是stdin、stdout、stderr,所以从3开始
}
fd2 = open(argv[2], O_RDWR | O_CREAT, 0777);
if(fd2 < 0){
perror("OPEN2");
exit(1);
}else{
printf("fd2 = %d\n", fd2); //4
}
close(fd1); //关闭文件1,此时fd=3被释放
fd3 = open(argv[3], O_RDWR | O_CREAT, 0777);
if(fd3 < 0){
perror("OPEN3");
exit(1);
}
printf("fd3 = %d\n", fd3); //3
close(fd2);
close(fd3);
return 0;
}
解析:
创建文件1,文件2 ,由于进程启动会首先打开0,1,2(分别对应stdin、stdout、stderr),所以fd1=3,fd2=4;
关闭文件1后,fd=3被释放出来,所以再创建文件3时,fd3被分配的是当前最小描述符,即刚刚被释放的fd1,所以fd=3。