文章目录
一、文件和文件描述符
在Linux中,一切都可以看作文件,所以文件扩展名对Linux内核没有实际意义,只是作为人为区分,方便用户使用。
1.文件
Linux中有7种文件类型:
文件类型标识符 | 文件类型 |
---|---|
- | 普通文件 |
d | 目录文件 |
l | 符号链接 |
c | 字符设备 |
b | 块设备 |
p | 管道 |
s | 套接字socket |
其中,前3者会占用磁盘空间来存储,而后面4个是伪文件,不占磁盘。
Linux命令行中,可通过ls -l 命令查看文件的类型
2.文件描述符
文件描述符(fd)用于指代被打开的文件,是一个非负整数,所有执行I/O操作的系统调用都通过文件描述符。
程序开始运行的时候,系统会自动打开3个文件描述符:
- 0:标准输入,即键盘(/dev/input/event0)
- 1:标准输出,即屏幕
- 2:标准出错,即屏幕
POSIX标准要求每次打开文件时,文件描述符必须是当前进程中最小的可用的文件描述符,所以,第一次打开的文件描述符一定是3(这里必须注意是当前进程)。
/*********************************************************************************
* Copyright: (C) 2021 xiaobai
* All rights reserved.
*
* Filename: file_write.c
* Description: This file is IO for fd
*
* Version: 1.0.0(04/03/2021)
* Author: kong siyu <2938797671@qq.com>
* ChangeLog: 1, Release initial version on "04/03/2021 04:08:26 PM"
*
********************************************************************************/
#include <stdio.h> //printf在该头文件中声明
#include <unistd.h> //STDOUT_FILENO,stdout等在该头文件中声明
#include <string.h> //strlen在该头文件中声明
#define MSG_STR "hello world\n"
int main(int argc, char **argv)
{
printf("%s", MSG_STR);
fputs(MSG_STR, stdout);
write(STDOUT_FILENO, MSG_STR, strlen(MSG_STR));
return 0;
}
结果:
二、文件IO操作
对文件的操作:open(文件路径,宏组合,权限) ->write(写到哪里,写的内容,写多少内容) ->read(从哪里读,读到哪里,读多少) ->close(fd),先看一个示例,后面会对函数进行介绍
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define BUFSIZE 1024
#define MSG_STR "hello world\n"
int main(int argc, char **argv)
{
int fd = -1;
int rv = -1;
char buf[BUFSIZE];
fd = open("test.txt", O_RDWR|O_CREAT|O_TRUNC, 0666); //open打开引号里的文件,第二个参数组合进行或运算,O_RDWR是对文件可读可写,O_C
REAT是文件不存在则创建。
if (fd < 0)
{
perror("open file failure"); //出错处理
return -1;
}
printf("open file returned file descriptor [%d]\n", fd);
if ((rv = write(fd, MSG_STR, strlen(MSG_STR))) < 0)
{
printf("write %d bytes into file failure: %s\n", rv, strerror(errno));
goto cleanup;
}
memset(buf, 0, sizeof(buf)); //可解决乱码问题
lseek(fd, 0, SEEK_SET); //可解决读不到的问题
if ((rv = read(fd, buf, sizeof(buf))