linux文件编程
系统调用
系统调用:由操作系统实现并提供给外部应用程序的编程接口。
用户程序运行在0-3g位置,内核程序运行在3-4g位置。
系统调用函数其实就是调用了内核的函数,系统函数是对内核函数做了一层封装。比如open函数,其实在它的内部是调用了sys_open函数。
man手册的使用:
open函数
函数原型:int open(const char * pathname,int falgs);int open(const char * pathname,int falgs,mode_t mode);int close(int fd);
常用参数:(需包含头文件fcntl.h)O_RDONLY O_WRONLY O_RDWRO_APPEND O_CREAT O_EXCL O_TRUNC O_NONBLOCK创建文件时,指定文件访问权限。权限同时受umask影响。文件权限=mode&~umask
open常见错误:打开不存在的文件(open返回-1),errno变量(需包含error.h文件)在文件打开错误时会被自动赋值,就像一个全局变量一样。以只写方式打开只读文件以只写方式打开目录
#include<unistd.h>
#include<stdio.h>
#include<fcntl.h>
#include<errno.h>
#include<string.h>
int main()
{
int fd;
fd=open("./file03.txt",O_RDONLY|O_CREAT|O_TRUNC,0777);
printf("fd=%d\n,errno=%d:%s\n",fd,errno,strerror(errno));
close(fd);
return 0;
}
read函数
ssize_t read(int fd,void* buf,size_t count);参数:fd:文件描述符buf:存数据的缓存区count:缓冲区大小返回值:成功:读到的字节数失败:-1,设置errno
write函数
ssize_t write(int fd,const void* buf,size_t count);参数:fd:文件描述符buf:存数据的缓存区count:实际要写入的字节数返回值:成功:写入的字节数失败:-1,并且会设置errno
实现cp
实现一个拷贝文件的程序。
#include<unistd.h> //文件相关函数
#include<stdio.h> //标准输入输出
#include<stdlib.h> //使用perror
#include<fcntl.h> //宏定义
#include<errno.h>
#include<string.h>
int main(int argc,char *argv[])
{
char buf[1024];
int n=0;
int fd1=open(argv[1],O_RDONLY);
if(fd1==-1) //这里==写成了=,导致老是在这里异常退出
{
perror("open argv1 error");
exit(1);
}
int fd2=open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0664); //倘若文件2的权限为只读(权限误写成0644),那么程序就会卡在这里
if(fd2==-1)
{
perror("open argv2 error");
exit(1);
}
while((n=read(fd1,buf,1024))!=0)
{
if(n<0)
{
perror("read error");
break;
}
write(fd2,buf,n);
}
close(fd1);
close(fd2);
return 0;
}
argv数组的第0个元素就是程序执行时的程序名字。
查看12道真题和解析

