文件
分类:
普通文件 、块特殊文件、fifo、套接字文件、链接文件、符号文件
使用查看命令: man open
打开函数
// 打开 文件名 类型(已存在)
int open(const char *pathname, int flags);
// 打开、创建 文件名 类型(不存在) 模式
int open(const char *pathname, int flags, mode_t mode);
// 创建 文件名 模式
int creat(const char *pathname, mode_t mode);
解释:
1、pathname 是要打开的或创建的含路径的文件名
2、flag是打开的模式,O_RDONLY ,O_WRONLY, O_RDWR,这三种方式互斥,但可以O_CREAT,O_EXCL配合使用,O_EXCL,创建文件时,检查文件是否存在,不存在时自动创建;文件存在时,导致打开文件错误
3、 mode,只有在创建文件时,才会使用该参数
操作函数
//fd所指的文件中,从whence处,偏移offset
off_t lseek(int fd, off_t offset, int whence);
//把常量buf,存放sizeof(buf)到filedes所指的文件中
ssize_t write(int fildes, const void *buf, size_t nbyte);
//从fd所指的文件中,建议读取count个字节到buffer缓存区中
ssize_t read(int fd,void*buffer,size_t count);
//先调用了lseek,然后掉调用了write
ssize_t pwrite(int fildes, const void *buf, size_t nbyte,off_t offset);
//同理一样
ssize_t pread(int fd, void *buf, size_t count, off_t offset);
解释
由于lseek和read 调用之间,内核可能会临时挂起进程,所以对同步问题造成了问题,调用pread相当于顺序调用了lseek 和read,这两个操作相当于一个捆绑的原子操作。
关闭函数
close(fd);
返回:
1、 打开文件成功时,返回文件描述符,失败时,返回-1
2、write,read成功时,返回流,否则返回-1
实例:
//读文件
1 #include<stdio.h>
2 #include<fcntl.h>
3 int main()
4 {
//打开
5 int fd = open("1.txt",O_RDONLY|O_CREAT,0755);
6 //int fd = open("1.txt",O_RDONLY);
7 if(fd == -1)
8 printf("Create File Fail.\n");
9 char buffer[128];
//读操作
10 int ret = read(fd,buffer,128);
11 if(ret == -1)
12 printf("Read File Fail.\n");
13 printf("%s",buffer);
//关闭
14 close(fd);
15 return 0;
16 }
//写文件
1 #include<stdio.h>
2 #include<fcntl.h>
3 #include<sys/stat.h>
4 int main()
5 {
6 const char buffer[]="Hello World";
7 int len = sizeof(buffer)+1;
//打开
8 int fd = open("2.txt",O_WRONLY|O_CREAT,0755);
9 if(fd == -1)
10 printf("Open File Fail.\n");
//操作
11 int res = write(fd,buffer,len);
12 if(res == -1)
13 printf("Write Fail Fail.\n");
//关闭
close(fd);
14 return 0;
15 }
//使用 od -c + 文件名 查看文件的实际情况
//lseek
#include<stdio.h>
2 #include<fcntl.h>
3 #include<sys/stat.h>
4 #include<sys/types.h>
5 int main()
6 {
7 char buf1[]="abcdefghij";
8 char buf2[]="ABCDEFGHIJ";
//打开
9 int fd = creat("3.txt",0755);
//打开
int res = open("3.txt",O_WRONLY);
//操作
10 write(fd,buf1,sizeof(buf1));
//从fd开始偏移20个字符,返回偏移量
11 int off=lseek(fd,20,SEEK_SET);
12 printf("%d",off);
13 write(fd,buf2,sizeof(buf2));
14 return 0;
15 }
重定向
dup && dupto 输出重定向 ; echo >> 输入重定向 ; exec函数家族,函数操作重定向
声明:
0 表示标准的输入 ,1 表示标准的输出 ,2 表示标准的错误
//复制旧的文件描述符,返回最小的尚未使用的文件描述符
int dup(int oldfd);
//关闭oldfd,返回newfd
int dup2(int oldfd,int newfd);
dup : dup()(输出重定向):返回最小的描述符
1、必须手动关闭标准的流
dup to(int oldfd,int newfd);
1、如果newfd已经打开,则先关闭
2、如果newfd 和 oldfd相等,则不关闭newfd,直接返回newfd
实例:
//dup
1 #include<stdio.h>
2 #include<sys/stat.h>
3 #include<fcntl.h>
4 #include<unistd.h>
5 int main()
6 {
7 int fd = open("myfile.txt",O_WRONLY|O_CREAT,0755);
8 //1 == STDOUT_FIELNO
9 close(1);
10 //重定向了输出方向
11 int fd1=dup(fd);
12 printf("Hello Dup fun()");
13 return 0;
14 }
//dup to
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<fcntl.h>
4 #include<sys/stat.h>
5 int main()
6 {
//打开文件
7 int fd = open("yourfile.txt",O_WRONLY|O_CREAT,0755);
8 //1 == STDOUT_FILENO
//自动关闭,标准的
9 int fd1=dup2(fd,1);
10 printf("Dup To Fun()");
11 return 0;
12 }
目录
对文件操作
int fcntl(int newfd);
int fcntl(int oldfd,int newfd);
//new fd 表示标准的
fcntl(fd,F_DUPFD,0) == dup(fd);
dup2(oldfd,newfd) == fcntl(fdold,F_DUPFD,newfd);
实例:
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<fcntl.h>
4 int main()
5 {
6 int fd = open("2.txt",O_CREAT|O_WRONLY,0755);
7 if(fd == -1)
8 perror("Open");
9 close(1);
10 fcntl(fd,F_DUPFD,1);
//输出重定向
11 printf("asdfjkhgfsad");
12 return 0;
13 }
14
16 /*
17 int main()
18 {
19 int fd = open("1.txt",O_CREAT|O_WRONLY,0755);
20 if(fd == -1)
21 {
22 perror("Open");
23 }
24 close(1);
25 int res = fcntl(fd,F_DUPFD,0);
26 //输出重定向
printf("1123456789");
27 return 0;
28 }
// 获取文件的属性参数
int stat(const char *restrict pathname,struct stat *resttict buf);
#include<stdio.h>
2 #include<unistd.h>
3 #include<stdlib.h>
4 #include<sys/stat.h>
5 #include<sys/types.h>
6 int main(int argc,char *argv[])
7 {
8 struct stat buf;
9 if(argc != 2)
10 {
11 printf("Usage: my_stat <filename>\n");
12 exit(0);
13 }
14 if(stat(argv[1],&buf) == -1)
15 {
16 perror("stat:");
17 exit(1);
18 }
//device id :64768
19 printf("device id %d\n",buf.st_dev);
20 return 0;