-
系统调用-文件访问
-
库函数-文件访问
-
时间编程
Linux中文件编程可以使用两种方法:
Linux系统调用
C/C++语言库函数
前者依赖于Linux系统,后者与操作系统是独立的,在任何操作系统下,使用C语言库函数操作文件的方法都是相同的。
系统调用-创建
int creat(const char *filename, mode_t mode)
- filename:要创建的文件名(包含路径,缺省为当前路径)
- mode:创建模式
常见的创建模式:
- S_IRUSR 可读
- S_IWUSR 可写
- S_IXUSR 可执行
- S_IRWXU 可读、可写、可执行
除了可以使用上述宏以外,还可以直接使用数字来表示文件的访问权限:
- 可执行 ->1
- 可写 ->2
- 可读 ->4
- 上述值的和,如可写可读 ->6
- 无任何权限 ->10
file_create.c
gcc file_create.c -o file_create
./file_create hello
create file hello success!
在Linux系统中,所有打开的文件都对应一个文件描述符。文件描述符的本质是一个非负整数。
当打开一个文件时,该整数由系统来分配。文件描述符的范围是0~OPEN_MAX
早期的UNIX版本OPEN_MAX=19,即允许每个进程同时打开20个文件,现在很多系统则将其增加至1024。
系统调用-打开
int open(const char *pathname, int flags)
int open(const char *pathname, int flags, mode_t mode)
- pathname:要打开的文件名(包含路径,缺省为当前路径)
- flags:打开标志
系统调用-关闭
当我们操作完文件以后,需要关闭文件: int close(int fd)
fd: 文件描述符(当我们使用open函数打开一个文件时,它会返回一个int 这个就是文件描述符fd)
系统调用-读
int read(int fd, const void *buf, size_t length)
功能:从文件描述符fd所指定的文件中读取length个字节到部分所指向的缓冲区中,返回值为实际读取的字节数。
系统调用-写
int write(int fd, const void *buf, size_t length)
功能:length个字节从buf指向的缓冲区中写到文件描述符fd所指向的文件中,返回值为实际写入的字节数。
系统调用-定位
int lseek(int fd, offset_t offset, int whence)
功能:将文件读写指针相对whence移动offset个字节。操作成功时,返回文件指针相对文件头的位置。
如何利用lseek来计算文件长度
#include <unistd.h>
int main()
{
if(access("/etc/passwd",R_OK)==0) #判断passwd这个文件是否是一个可读的文件
printf("/etc/passwd can be read!\n")
}
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#define BUFFER_SIZE 1024
int main(int argc, char **argv)
{
int from_fd,to_fd;
int bytes_read,bytes_write;
char buffer[BUFFER_SIZE];
char *ptr;
if(argc!=3)
{
fprintf(stderr,"Usage:%s fromfile tofile /n/a",argv[0]);
exit(1);
}
/*打开源文件*/
if((from_fd = open(argv[1],O_RDONLY)) == -1)
{
fprintf(stderr,"Open:%s Error:%s/n",argv[1],strerror(errno));
exit(1);
}
/*创建目的文件*/
if((from_fd = open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR)) == -1)
{
fprintf(stderr,"Open:%s Error:%s/n", argv[2],strerror(errno));
exit(1);
}
/*以下代码是一个金典的拷贝文件代码*/
while(bytes_read = read(from_fd, buffer, BUFFER_SIZE))
{
/*如果一个致命错误发生*/
if((bytes_read == -1)&&(errno != EINTR)) break;
else if(bytes_read > 0)
{
ptr = buffer;
while(bytes_write = write(to_fd, ptr, bytes_read))
{
/*如果一个致命错误发生*/
if((bytes_write == -1)&& (errno != EINTR)) break;
/*写完了所有都的字节*/
else if(bytes_write == bytes_read) break;
/*写了一部分继续写*/
else if(bytes_write > 0)
{
ptr += bytes_write;
bytes_read -= bytes_write;
}
}
/*如果写时发生了一个致命错误*/
if(bytes_write == -1) break;
}
}
close(from_fd);
close(to_fd);
exit(0);
}
vi s1 创建一个s1文件
./file_cp s1 s2 拷贝s1文件
库函数-文件访问
时间编程
计算一个函数使用的时间