Linux 4 day 18号完结

Linux 4day

1.文件操作函数 stat函数
(1).获取文件信息
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <unistd.h>
 int stat(const char *path, struct stat *buf);
 int lstat(const char *pathname, struct stat *buf);
 功能:
     获取文件状态信息
     stat和lstat的区别:
         当文件是一个符号链接时,lstat返回的是该符号链接本身的信息;
         而stat返回的是该链接指向的文件的信息。
 参数:
     path:文件名
     buf:保存文件信息的结构体
 返回值:
     成功: 0
     失败: -1

代码读取

 #include <sys/types.h>
 #include <sys/stat.h>
 #include <unistd.h>
 #include<stdio.h>
 int main(int argc,char**argv)
 {
 struct stat buf;
 int cd=-1;
 if(2!=argc)
 {
 printf("cw");
 return 1;
 }
 cd=stat(argv[1],&buf);
 if(-1==cd)
 {
 printf("cw");
 }
 
 printf("st_dev : %lu\n",buf.st_dev);
 printf("st_size : %lu\n",buf.st_size);
 
 printf("cw");
 return 0;
 }

结构体信息

 struct stat {
     dev_t           st_dev;     //文件的设备编号
     ino_t           st_ino;     //节点
     mode_t          st_mode;            //文件的类型和存取的权限
     nlink_t         st_nlink;       //连到该文件的硬连接数目,刚建立的文件值为1
     uid_t           st_uid;     //用户ID
     gid_t           st_gid;     //组ID
     dev_t           st_rdev;        //(设备类型)若此文件为设备文件,则为其设备编号
     off_t           st_size;        //文件字节数(文件大小)
     blksize_t       st_blksize;     //块大小(文件系统的I/O 缓冲区大小)
     blkcnt_t        st_blocks;      //块数
     time_t          st_atime;       //最后一次访问时间
     time_t          st_mtime;       //最后一次修改时间
     time_t          st_ctime;       //最后一次改变时间(指属性)
 };

结构体 mode_t内存粹着文件的类型和权限 以下我们将读取出来

1527683997494

(2).stat获取信息的第一个版本

st_mode->

 void show(struct stat *s)
 {
 int a=4;
 switch(s->st_mode & S_IFMT)//与运算的结果进行case
 {
 case S_IFREG:
 printf("w %d",a);
 break;
 
 default:
 break;
 }
 }

1527684045659

(2).stat获取文件信息的第2个版本
 void show(struct stat *s)
 {
 if(S_ISREG(s->st_mode))
 {
 printf("ahah\n");
 }
 }
(3).获取文件的权限
 void show(struct stat *s)
 {
 if(s->st_mode & S_IRUSR)
 {
 printf("R");
 }else
 {
 printf("-");
 }
 if(s->st_mode & S_IWUSR)
 {
 printf("W");
 }else
 {
 printf("-");
 }
 if(s->st_mode & S_IXUSR)
 {
 printf("X");
 }else
 {
 printf("-");
 }
 
 }

QQ图片20230619224218

2.其他的文件操作相关函数

1.access函数

 #include <unistd.h>
 
 int access(const char *pathname, int mode);
 功能:测试指定文件是否具有某种属性
 参数:
     pathname:文件名
     mode:文件权限,4种权限
         R_OK:   是否有读权限
         W_OK:   是否有写权限
         X_OK:   是否有执行权限
         F_OK:   测试文件是否存在
 返回值:
     0:  有某种权限,或者文件存在
     -1:没有,或文件不存在
 
 access("txt", F_OK);

2.chmod函数

 #include <sys/stat.h>
 
 int chmod(const char *pathname, mode_t mode);
 功能:修改文件权限
 参数:
     filename:文件名
     mode:权限(8进制数)
 返回值:
     成功:0
     失败:-1

3.chown函数

 #include <unistd.h>
 
 int chown(const char *pathname, uid_t owner, gid_t group);
 功能:修改文件所有者和所属组
 参数:
     pathname:文件或目录名
     owner:文件所有者id,通过查看 /etc/passwd 得到所有者id
     group:文件所属组id,通过查看 /etc/group 得到用户组id
 返回值:
     成功:0
     失败:-1

4. truncate函数

 #include <unistd.h>
 #include <sys/types.h>
 
 int truncate(const char *path, off_t length);
 功能:修改文件大小
 参数:
     path:文件文件名字
     length:指定的文件大小
         a)比原来小, 删掉后边的部分
         b)比原来大, 向后拓展
 返回值:
     成功:0
     失败:-1

5.link函数

 #include <unistd.h>
 
 int link(const char *oldpath, const char *newpath);
 功能:创建一个硬链接
 参数:
     oldpath:源文件名字
     newpath:硬链接名字
 返回值:
     成功:0
     失败:-1

6.symlink函数

 #include <unistd.h>
 
 int symlink(const char *target, const char *linkpath);
 功能:创建一个软链接
 参数:
     target:源文件名字
     linkpath:软链接名字
 返回值:
     成功:0
     失败:-1

7.readlink函数

 #include <unistd.h>
 
 ssize_t readlink(const char *pathname, char *buf, size_t bufsiz);
 功能:读软连接对应的文件名,不是读内容(该函数只能读软链接文件)
 参数:
     pathname:软连接名
     buf:存放软件对应的文件名
     bufsiz :缓冲区大小(第二个参数存放的最大字节数)
 返回值:
     成功:>0,读到buf中的字符个数
     失败:-1
 

8. unlink函数

 #include <unistd.h>
 
 int unlink(const char *pathname);
 功能:删除一个文件(软硬链接文件)
 参数:
     pathname:删除的文件名字
 返回值:
     成功:0
     失败:-1

9. rename函数

 #include <stdio.h>
 
 int rename(const char *oldpath, const char *newpath);
 功能:把oldpath的文件名改为newpath
 参数:
 oldpath:旧文件名
 newpath:新文件名
 返回值:
 成功:0
 失败:-1
3.文件描述符复制(重)

同一个文件描述符控制同一个文件

1.dup函数
 #include <unistd.h>
 int dup(int oldfd);
 功能:
     通过 oldfd 复制出一个新的文件描述符,新的文件描述符是调用进程文件描述符表中最小可用的文件描述符,最终 oldfd 和新的文件描述符都指向同一个文件。
 参数:
     oldfd : 需要复制的文件描述符 oldfd
 返回值:
         成功:新文件描述符
         失败: -1
2.dup2函数
 #include <unistd.h>
 int dup2(int oldfd, int newfd);
 功能:
     通过 oldfd 复制出一个新的文件描述符 newfd,如果成功,newfd 和函数返回值是同一个返回值,最终 oldfd 和新的文件描述符 newfd 都指向同一个文件。
 参数:
     oldfd : 需要复制的文件描述符
     newfd : 新的文件描述符,这个描述符可以人为指定一个合法数字(0 - 1023),如果指定的数字已经被占用(和某个文件有关联),此函数会自动关闭 close() 断开这个数字和某个文件的关联,再来使用这个合法数字。
 返回值:
     成功:返回 newfd
     失败:返回 -1

函数注释:

我们用write来写入文件的时候 会改变文件编译量 而我们复制的文件描述符 都是共享的文件表 故此不会被覆盖输出

3.dup过程

QQ图片20230619230026

 #include <sys/types.h>
 #include <sys/stat.h>
 #include <unistd.h>
 #include<stdio.h>
 #include<fcntl.h>
 int main(int argc,char**argv)
 {
 int fd=-1;
 int newfd=-1;
 fd=open("qwec.txt",O_RDWR |O_CREAT, 0664);
 if(fd==-1)
 {
 perror("open");
 return 1;
 }
 write(fd,"Abc",3);
 //
 newfd=dup(fd);
 write(newfd,"newfd",9);
 return 0;
 }

4. fcnlt函数

 #include <unistd.h>
 #include <fcntl.h>
 int fcntl(int fd, int cmd, ... /* arg */);
 功能:改变已打开的文件性质,fcntl针对描述符提供控制。
 参数:
     fd:操作的文件描述符
     cmd:操作方式
     arg:针对cmd的值,fcntl能够接受第三个参数int arg。
 返回值:
     成功:返回某个其他值
     失败:-1

fcntl函数有5种功能:

  1. 复制一个现有的描述符(cmd=F_DUPFD)

  2. 获得/设置文件描述符标记(cmd=F_GETFD或F_SETFD)

  3. 获得/设置文件状态标记(cmd=F_GETFL或F_SETFL)

  4. 获得/设置异步I/O所有权(cmd=F_GETOWN或F_SETOWN)

  5. 获得/设置记录锁(cmd=F_GETLK, F_SETLK或F_SETLKW)

    // 等价于dup() 复制文件符
     int new_fd = fcntl(fd, F_DUPFD, 0);
     // 获取文件状态标志
     int flag = fcntl(fd, F_GETFL, 0);
     switch (flag & O_ACCMODE)//获取权限
    {
     case O_RDONLY:
         printf("read only\n");
         break;
     case O_WRONLY:
         printf("write only\n");
         break;
     case O_RDWR:
         printf("read and write\n");
         break;
     default:
         break;
    }
     if (flag & O_APPEND)
    {
        printf("append\n");
    }
     flag |= O_APPEND; // 追加flag
     fcntl(fd, F_SETFL, flag); //设置文件状态标记


posted @ 2023-06-17 23:04  大橘|博客  阅读(26)  评论(0)    收藏  举报