1.lseek
lseek和标准I/O库的fseek函数类似,可以移动当前读写位置(或者叫偏移量)。
每个打开的文件都记录着当前读写位置,打开文件时读写位置是0,表示文件开头,通
常读写多少个字节就会将读写位置往后移多少个字节。但是有一个例外,如果以O_APPEND方式打开,每次写操作都会在文件末尾追加数据,然后将读写位置移到新的文件末尾。
参数offset和whence的含义和fseek函数完全相同。只不过第一个参数换成了文件描述
符。和fseek一样,偏移量允许超过文件末尾,这种情况下对该文件的下一次写操作将延长
文件,中间空洞的部分读出来都是0。off_t返回偏移指针位置到文件最开头有多少个字节
其主要功能是在打开的文件移动读写指针位置
另外还有一些:
(1)用lseek来拓展文件
(如可以创一个10M的空文件)
怎么看里面内容
od -tcx abc
(实际都用\0补充)
一定要有一次写操作
(2)用lessk获取文件大小
因为off_t返回偏移指针位置到文件最开头有多少个字节,把读写位置设置到末尾。
实例去实现这两个功能
#include<stdio.h>
#include<fcntl.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/stat.h>
#include<errno.h>
#include<stdlib.h>
int main(void){
int fd=open("abc",O_RDWR);
if(fd<0){
perror("open abc");
exit(-1);
}
lseek(fd,0x1000,SEEK_SET);//4096bytes
write(fd,"a",1);
close(fd);
fd=open("hello",O_RDWR);
if(fd<0){
perror("open hello");
exit(-1);
}
printf("hello size= %ld\n",lseek(fd,0,SEEK_END)); //偏移量为0,SEEK_END
close(fd);
return 0;
}
2、fcntl
fcntl获取和设置文件访问控制属性,改变一个已经打开的文件属性获取设置
设置非阻塞I/O,我们需要在调用open时指定O_NONBLOCK标志。
另外一种办法,可以用fcntl函数改变一个已打开的文件的属性,可以重新设置读、写、追加、非阻塞等标志(这些标志称为File Status Flag),而不必重新open文件。
#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg);
int fcntl(int fd, int cmd, struct flock *lock);
3、ioctl
ioctl是I/O操作的杂物箱。终端I/O是使用ioctl最多的地方。
ioctl命令传送的是控制信息,其中的数据是辅助的数据。
例如,在串口线上收发数据通过read/write操作,而串口的波特率、校验位、停止位通
过ioctl设置,A/D转换的结果通过read读取,而A/D转换的精度和工作频率通过ioctl设置。
通信串口通信
(T发送 R接受 波特率每秒发送的比特位,开发驱动)
实例获取终端窗口大小
#include<sys/ioctl.h>
#include<stdlib.h>
#include<unistd.h>
#include<stdio.h>
int main(){
struct winsize size;//终端窗口大小
if(isatty(STDOUT_FILENO)==0){
exit(1);
}
if(ioctl(STDOUT_FILENO,TIOCGWINSZ,&size)<0){
perror("ioctl TIOCGWINSZ error");
exit(1);
}
printf("%d rows, %d columns\n",size.ws_row,size.ws_col);
return 0;
}