文件、目录的操作(dup,fcntl,stat)

文件

分类:

普通文件 、块特殊文件、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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值