/*open_test.c 打开文件的例子*/
#include
#include
#include
#include
int main(void)
{
int fd = -1;
char filename[] = "test.txt";
fd = open(filename,O_RDWR);
if(fd>-1)
{
printf("Open file %s success,fd:%d\n",filename,fd);
}
else
{
printf("Open file %s failure!\n",filename);
}
return 0;
}
$ ll
总用量 5
drwxrwxrwx 1 zhujun zhujun 256 10月 4 18:54 ./
drwxrwxrwx 1 zhujun zhujun 360 10月 4 18:23 ../
-rwxrwxrwx 1 zhujun zhujun 638 10月 4 18:54 open_test.c*
$ gcc -o open1 open_test.c
$ ./open1
Open file test.txt failure!
$ echo "">test.txt
$ ./open1
Open file test.txt success,fd:3
头文件unistd.h
int close(int fd);
/* 文件read_test.c */
#include
#include
#include
#include
#include
int main(void)
{
int fd = -1;
ssize_t size = -1;
char buff[10];
char filename[] = "test.txt";
fd = open(filename, O_RDONLY);
if(fd<0)
{
printf("Open file %s failure\n",filename);
}
else
{
printf("Open file %s success,fd %d\n",filename,fd);
}
while(size)
{
size = read(fd, buff, 10);
if(size == -1)
{
close(fd);
printf("Read file error occurs.\n");
return -1;
}
else
{
if(size>0)
{
printf("Read %d bytes:",size);
printf("\"");
for(int i=0;i<size;i++)
printf("%c",*(buff+i));
printf("\"\n");
}
else
{
printf("Reach EOF.\n");
}
}
}
return 0;
}
test.txt 文件内容:
This is a test file to test if read function could run well.
$ gcc -o rt read_test.c
read_test.c: In function ‘main’:
read_test.c:29:37: warning: format ‘%ld’ expects argument of type ‘long int’, but argument 3 has type ‘int’ [-Wformat=]
printf("Open file %s success,fd %ld\n",filename,fd);
~~^
%d
read_test.c:44:19: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘ssize_t {aka long int}’ [-Wformat=]
printf("Read %d bytes:",size);
~^
%ld
$ ./rt
Open file test.txt success,fd 3
Read 10 bytes:"This is a "
Read 10 bytes:"test file "
Read 10 bytes:"to test if"
Read 10 bytes:" read func"
Read 10 bytes:"tion could"
Read 10 bytes:" run well."
Read 1 bytes:"
"
Reach EOF.
#include
#include
off_t lseek(int fd, off_t offset, int whence);
描述:
对文件描述符fd对应的文件,按照模式whence和相对偏移量offset,重新设置文件的偏移量。返回新的偏移量(成功),失败返回-1。
whence表示操作模式,offset表示相对偏移量
whence:
SEEK_SET
文件起始位置
SEEK_CUR
当前偏移位置
SEEK_END
文件末尾
off_t cur_pos = lseek(fd, 0, SEEK_CUR)
可以获得当前的偏移量,也可以校验当前设备是否支持lssek函数。
示例
/* lseek_test.c */
#include
#include
#include
#include
#include
int main(void)
{
off_t offset = -1;
offset = lseek(1, 0, SEEK_CUR);/*将标准输入文件描述符的文件偏移量设为当前值*/
/* 0,1,2描述符分配给系统,0:标准输入;1:标准输出;2:标准错误*/
if(offset == -1)
{
printf("STDOUT can`t seek\n");
return -1;
}
else
{
printf("STDOUT can seek\n");
}
return 0;
}
$ gcc -o lsek lseek_test.c
$ ./lsek
STDOUT can`t seek
#include
#include
#include
int stat(const char* path, struct stat * buf);
int fstat(int fd, struct stat * buf);
int lstat(const char* path, struct stat *buf);
struct stat
{
dev_t st_dev; /*此文件所处设备的设备ID号*/
ino_t st_ino; /*inode数值*/
mode_t st_mode; /*保护设置*/
nlink_t st_nlink; /*硬连接数*/
uid_t st_uid; /*文件所有者的ID*/
gid_t st_gid; /*文件所有者的组的ID*/
dev_t st_rdev; /*以字节计算的大小*/
blksize_t st_blksize; /*文件系统的块大小*/
blkcnt_t st_blocks; /*占用的块的数量*/
time_t st_atime; /*最后方位时间*/
time_t st_mtime; /*最后修改时间*/
time_t st_ctime; /*最后状态改变时间*/
}
#include
void* mmap(void * start, size_t length, int prot, int flags, int fd, off_t offset);
值 | 描述 |
---|---|
PROT_EXEC | 可执行 |
PROT_READ | 可读 |
PROT_WRITE | 可写 |
PROT_NONE | 不能存取 |
值 | 描述 |
---|---|
MAP_FIXED | 如果设置了start,而无法映射到所指的地址,则映射失败 |
MAP_SHARED | 共享映射区域,映射区域允许其他进程共享,对映射区域写入数据将会写入到原文件中 |
MAP_PRIVATE | 对映射区域的修改不会写入原文件 |
MAP_ANONYMOUS | 建立匿名映射。此时忽略参数fd,不涉及文件,而且映射区无法和其他进程共享 |
MAP_DENYWRITE | 禁止文件写入操作,只能通过对映射区操作的方式实现对文件的操作,不允许直接操作文件 |
MAP_LOCKED | 将映射区锁定,此区域不会被虚拟内存重置 |
MAP_PRIVATE,MAP_SHARED必须选其一。shared表示多个进程使用一个内存映射的副本,任何进程都可以对此映射区进行修改,而且修改可见。private表示多个进程之间的副本不一致,写入操作之后,会复制一个副本给修改的进程。
#include
int munmap(void* start, size_t length);
/*打开文件*/
fd = open(filename, flags, mode);
if(fd<0)
...(error);
ptr = mmap(NULL, len, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
/*对文件进行操作*/
...
/*取消映射关系*/
numap(ptr, len);
/*关闭文件*/
close(fd);
#include
#include
#include
#include
#include
#include
#include
#define FILELENGTH 80
int main(void)
{
int fd = -1;
char buf[] = "quick brown fox jumps over the lazy dog";
char* ptr = NULL;
/*打开文件,并将文件长度缩短为0,不存在则创建,权限为可读可写可执行*/
fd = open("mmap.txt", O_RDWR|O_CREAT|O_TRUNC, S_IRWXU);
if(fd == -1) return -1;
/*将文件长度扩展为80,向后偏移文件的偏移量到79*/
lseek(fd, FILELENGTH-1, SEEK_SET);
write(fd, "a", 1);/*随意写入一个字符*/
/*将文件mmap.txt中的数据从开头到1M的数据映射到内存中,对文件操作立即显示在文件上,可读写*/
ptr = (char*)mmap(NULL, FILELENGTH, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
if((char*)-1 == ptr )
{
printf("mmap failure\n");
close(fd);
return -1;
}
/*将buf中的字符串复制到映射区域中,起始位置为ptr+16*/
memcpy(ptr+16, buf, strlen(buf));
munmap(ptr, FILELENGTH);
close(fd);
return 0;
}
$ gcc -o mapt mmap_test.c
$ ./mapt
$ ll
总用量 82
drwxrwxrwx 1 zhujun zhujun 4096 10月 5 16:07 ./
drwxrwxrwx 1 zhujun zhujun 4096 10月 4 18:23 ../
-rwxrwxrwx 1 zhujun zhujun 8704 10月 5 16:07 mapt*
-rwxrwxrwx 1 zhujun zhujun 1347 10月 5 16:06 mmap_test.c*
-rwxrwxrwx 1 zhujun zhujun 80 10月 5 16:07 mmap.txt*
$ od -c mmap.txt
0000000 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000020 q u i c k b r o w n f o x
0000040 j u m p s o v e r t h e l
0000060 a z y d o g \0 \0 \0 \0 \0 \0 \0 \0 \0
0000100 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 a
0000120