1.open()
int open(const char *patnname,int flags);
打开或创建一个文件或者device。
flags文件打开常用的选项是 O_RDONLY(只读),O_WRONLY(只写),O_RDWR(读写),这三个是必须有一个的加上一些文件创建的选项和文件状态选项。在加上O_CREAT,这个函数就变成了
int open(const char *pathname,int flags,mode_t mode);
创建文件的权限由第三个参数mode决定最终的权限,例如777即拥有者以及用户组还有其他用户都是可读可写可执行。
返回值:成功返回的是新的文件描述符(>0);失败返回-1
这个函数是不是阻塞函数在于你有没有加O_NONBLOCK,加上去这句话就是非阻塞,没有加上去那就是阻塞函数。
fopen函数的mode与open函数的flag
r O_RDONLY
r+ O_RDWR
w O_WRONLY|O_CREAT|O_TRUNC
w+ O_RDWR|O_TRUNC|O_CREAT
flags就是位图操作,位图就是通过或和与。如果想要测试O_WRONLY是否有这个功能。可以先或后与查看这两次的区别。
创建文件得到的权限是用你给的值mode&~umask得到文件权限
这个函数有三参和两参的区别,在java里面叫做重构,但是c语言里面没有重构这个概念,所以c语言里面这个函数是通过变参函数来实现的。
如何判断函数使用重载还是变参来实现的,那就在这个函数当中多输入几个参数,如果报语法错误那就是重载,如果不报错或者报其他错误那就是变参实现的。
gcc -Wall 文件名 打印所有的警告
gcc 本身的说法就比较圆环,虽然他报出来的是waring但其实是一个err。在做内核移植的时候除了一些可以解释的waring,其他waring都应该调试成没有警告。
int close (fp);关闭一个文件描述符。
2.read wite
ssize_t read(int fd,void *buf,size_t count);
fd可以是文件也可以是设备因为一切皆文件。
从fd中读count到buf。
成功返回读到的字节个数,如果读到文件尾那么返回0.
失败返回-1。并记录当前错误的原因到errno。也就是用perroe("read()");会输出错误的原因。
ssize_t write(int fd ,const void * buf ,size_t count );
向fd中写(已经成功打开的),来源是buf,写count个到文件或设备中去。
成功返回写入的字节数,0是一个也没写进去。
因为err有真错和假错,假错是因为你被某些阻塞或者非阻塞一些会遇到的情况打断了,才会导致写入0个,所以0不一定是出错,要看err的原因判断是不是真出错。
失败 -1 设置errno。
程序#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define BUFSIZE 20
int main(int argc,char **argv)
{
if(argc<3)
{
fprintf(stderr,"usage :%s <srcfile> <destfile>",argv[0]);
exit(1);
}
int sfd,sfp;
char buf[BUFSIZE];
int len,ret,pos;
sfd=open(argv[1],O_RDONLY);
if(sfd<0)
{
perror("open()");
exit(1);
}
sfp=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0777);
if(sfp<0)
{
close(sfd);
perror("open()");
exit(1);
}
while(1)
{
len=read(sfd,buf,BUFSIZE);
if(len<0)
{
perror("read()");
break;
}
if(len==0)
{
break;
}
pos=0;
while(len>0)
{
ret=write(sfp,buf+pos,len);
if(ret<0)
{
perror("write()");
exit(1);
}
pos+=ret;
len=len-ret;
}
}
close(sfd);
close(sfp);
exit(0);
}
3.lseek()
off_t lseek(int fd,off_t offset,int whence);
whence : SEEK_SET,SEEK_CUR,SEEK_END
将鼠标位置插入到某个位置。
返回值:成功从当前位置指针到你设置的文件位置指针所经历的字节数。
相当于fseeko与ftello的结合体。
程序
1 #include "stdio.h"
2 #include "stdlib.h"
3 #include "sys/types.h"
4 #include "sys/stat.h"
5 #include "fcntl.h"
6 #include "unistd.h"
7 int main(int argc,char ** argv)
8 {
9 if(argc<2)
10 {
11 fprintf(stderr,"Usage : %s <soufile> <destfile>",argv[0]);
12 exit(1);
13 }
14 int fp;
15 off_t len;
16 fp= open(argv[1],O_RDONLY);
17 if(fp<0)
18 {
19 perror("open()");
20 exit(1);
21 }
22 len=lseek(fp,0,SEEK_SET);
23 if(len<0)
24 {
25 perror("lseek()");
26 close(fp);
27 exit(1);
28 }
29 len=lseek(fp,0,SEEK_END);
30 if(len<0)
31 {
32 perror("lseek()");
33 close(fp);
34 exit(1);
35 }
36 printf("%s的长度为%ld字节",argv[1],len);
37 close(fp);
38 exit(0);
39 }
~