sysIO 文件操作
打开文件
头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
函数原型
int open(const char *pathname, int flags);
参数说明
pathname
:表示文件路径。- flags:表示标志位,有以下几种选项:
O_RDONLY
:表示只读O_WRONLY
:表示只写O_RDWR
:表示可读可写O_APPEND
:表示追加O_CREAT
:表示创建O_TRUNC
:表示清空O_NONBLOCK
:表示取消阻塞标志位
返回值
- 成功:返回未使用的最小文件描述符,非负正数(0 ~ 1024)
- 失败:返回
-1
计算机识别文件的唯一标识是文件索引号或者inode节点号。
另一种打开文件的方式
int open(const char *pathname, int flags, mode_t mode);
第三个参数:mode_t mode
- mode:当创建新文件时,这个参数用于指定新文件的权限位。它是一个位掩码,通常使用以下宏来设置:
S_IRUSR
或0444
:用户读权限。S_IWUSR
或0222
:用户写权限。S_IXUSR
或0111
:用户执行权限。S_IRGRP
:组读权限。S_IWGRP
:组写权限。S_IXGRP
:组执行权限。S_IROTH
:其他用户读权限。S_IWOTH
:其他用户写权限。S_IXOTH
:其他用户执行权限。
创建文件并打开
int creat(const char *pathname, mode_t mode); // 默认:O_CREAT | O_WRONLY | O_TRUNC
umask
umask
:默认权限
file = 666 - umask
dir = 777 - umask
mode & ~umask // 0022
设定umask
mode_t umask(mode_t mask);
关闭文件
函数原型
int close(int fd);
读文件
函数原型
ssize_t read(int fd, void *buf, size_t count);
参数说明
fd
:表示文件描述符。buf
:表示获取数据的空间地址。count
:表示空间大小。
返回值
- 成功:返回获取的字符个数。
- 失败:返回
-1
。
写数据
函数原型
ssize_t write(int fd, const void *buf, size_t count);
参数说明
fd
:表示文件描述符。buf
:表示要写入的数据的地址。count
:表示要写入的数据的大小。
输出缓冲区
write
:无缓冲函数printf
:行缓冲函数fprintf
snprintf
fwrite
:满缓冲函数
lseek
函数原型
off_t lseek(int fildes, off_t offset, int whence);
参数说明
- 第一个参数:表示文件描述符
open
- 第二个参数:表示偏移量
- 第三个参数:表示偏移位置
SEEK_SET
:从文件开头开始偏移SEEK_CUR
:从当前位置开始偏移SEEK_END
:从文件末尾开始偏移
返回值
- 成功:表示从文件开头偏移到指定的位置
- 失败:返回
-1
共享文件符
函数原型
int dup(int oldfd);
- 参数:表示已打开文件描述符
int dup2(int oldfd, int newfd);
- 参数:指定共享文件描述符的号
新的文件描述符:
- 未使用,则把指定文件描述符指向旧的文件描述符
- 使用,则先关闭原来的文件描述符,再让新的指向旧的文件描述符
实现输出重定向
int main(int argc, char *argv[])
{
int fd1, fd2;
char buf[1024];
GETLINES("input a str :", buf);
fd1 = open("txt", O_WRONLY | O_TRUNC | O_CREAT);
fd2 = dup2(fd1, 1);
printf("%s\n", buf);
fflush(NULL);
return 0;
}
获取文件属性多功能函数
函数原型
int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg);
int fcntl(int fd, int cmd, struct flock *lock);
参数说明
- 第一个参数:文件描述符
- 第二个参数:表示指令
F_DUPFD
:表示复制文件描述符 //要类似于dup2时要手动close()原来的文件描述符F_GETFL
:表示获取文件标志位F_SETFL
:表示设置文件状态标志位
- 第三个参数:表示对指令补充
返回值
- 失败:返回
-1
示例:
flag = fcntl(fd, F_GETFL);
flag |= O_APPEND;
flag = fcntl(fd, F_SETFL, flag);
设备类控制函数
函数原型
int ioctl(int d, int request, ...);
参数说明
- 第一个参数:表示文件描述符
- 第二个参数:表示指令
...
:表示对命令补充
返回值
- 成功:返回
0
- 失败:返回
-1
示例结构体:
struct winsize {
unsigned short ws_row; // 表示行
unsigned short ws_col; // 表示列
unsigned short ws_xpixel; // 行像素
unsigned short ws_ypixel; // 列像素
};
示例:
int main(int argc, char *argv[])
{
int ret;
struct winsize win = {};
// 获取显示器像素或者行和列
ret = ioctl(1, TIOCGWINSZ, &win);
ERRP(ret == -1, ioctl, goto ERR1);
printf("row : %d col : %d\n", win.ws_row, win.ws_col);
printf("x : %d y : %d\n", win.ws_xpixel, win.ws_ypixel);
system("clear");
printf("\033[%d;%dHname : ", win.ws_row / 2, win.ws_col / 2);
getchar();
return 0;
ERR1:
return -1;
}