IO进程线程,文件IO(open),文件(stat)与目录(opendir)属性的读取

这篇具有很好参考价值的文章主要介绍了IO进程线程,文件IO(open),文件(stat)与目录(opendir)属性的读取。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

      一、文件IO

1、文件io通过系统调用来操作文件

系统调用:系统提供给用户的一组API(接口函数)

        open/read/write/close/lseek...

用户空间进程访问内核的接口

把用户从底层的硬件编程中解放出来

极大的提高了系统的安全性

使用户程序具有可移植性(同一系统下)

是操作系统的一部分

文件io没有缓存区概念

文件io操作文件的方式:通过文件描述符

shell默认打开了三个文件:

标准输入  标准输出 标准错误

stdin stdout  stderr                  用流来表示

      0         1       2                   用文件描述符表示

2、文件IO相关函数

       1、open函数

       功能:

              打开一个文件

       头文件

          #include <sys/types.h>

       #include <sys/stat.h>

       #include <fcntl.h>

       函数原型

              int open(const char *pathname, int flags);

        int open(const char *pathname, int flags, mode_t mode);

       参数

        pathname:文件的路径

              flags:文件打开的方式

                     O_RDONLY:只读

                     O_WRONLY:只写

                     O_RDWR:可读可写

                     这三个宏互斥(三选一)

                     O_CREAT:如果文件不存在,则创建文件,此时用到open函数的第二种形式。

                     O_TRUNC:如果文件存在则清空文件的内容。

                     O_APPEND:以追加的方式打开文件。

                     IO进程线程,文件IO(open),文件(stat)与目录(opendir)属性的读取,算法,linux,文件IO

       mode:文件的权限,八进制(0777)

IO进程线程,文件IO(open),文件(stat)与目录(opendir)属性的读取,算法,linux,文件IO

       返回值

              成功返回一个新的文件描述符,失败返回(-1)并设置错误号。

       2、close函数

       作用:

              关闭文件

       头文件

          #include <unistd.h>

       函数原型

              int close(int fd);

       参数

        想要关闭的文件描述符

       返回值

              成功返回0,失败返回(-1)并设置错误号。

       3、read/write

        1、read

              作用:

                     向文件读取内容

           头文件:

            #include <unistd.h>

              函数原型

                ssize_t read(int fd, void *buf, size_t count);

              参数

                     fd:想要操作的文件描述符

                     buf:读取到的内容放到哪个地址

                     count:读取到的文件中的字符数量

              返回值:

              成功返回已经读取到的字节数,失败返回-1并设置错误号,读取到文件末尾返回0。

        2、write

              作用:

                     向文件写入内容

           头文件:

            #include <unistd.h>

              函数原型

                ssize_t write(int fd, void *buf, size_t count);

              参数

                     fd:想要写入的文件描述符

                     buf:需要写入文件的内容

                     count:写入文件中字符数量

              返回值:

                     成功返回已经写入的字节数,失败返回-1并设置错误号。

       4、lseek

              作用:

                     偏移文件内的书签

           头文件:

            #include <sys/types.h>

              函数原型

                off_t lseek(int fd, off_t offset, int whence);

              参数

                     fd:想要写入的文件描述符

                     offset:偏移量,正数表示后偏移,负数前偏移,0不偏移

                     whence:书签偏移的起始位置

                                   SEEK_SET:文件头

                                   SEEK_CUR:当前位置

                                   SEEK_END:文件末尾

              返回值:

                     成功返回当前偏移到的位置,失败返回-1并设置错误号。

      二、文件和目录

1、stat

       #include <sys/types.h>

       #include <sys/stat.h>

       #include <unistd.h>

int stat(const char *pathname, struct stat *statbuf);

int fstat(int fd, struct stat *statbuf);

int lstat(const char *pathname, struct stat *statbuf);

stat,lstat通过传入的pathname获取文件属性

fstat通过用open打开的文件的文件描述符获取文件属性

stat在操作软链接文件时会获取源文件的相关属性

lstat在操作软链接文件时会获取链接文件的相关属性

成功返回0,失败返回-1,并设置错误号

相关结构体

struct stat {

               dev_t     st_dev;         /* ID of device containing file */

               ino_t     st_ino;         /* Inode number */

               mode_t    st_mode;        /* File type and mode */

               nlink_t   st_nlink;       /* Number of hard links */

               uid_t     st_uid;         /* User ID of owner */

               gid_t     st_gid;         /* Group ID of owner */

               dev_t     st_rdev;        /* Device ID (if special file) */

               off_t     st_size;        /* Total size, in bytes */

               blksize_t st_blksize;     /* Block size for filesystem I/O */

               blkcnt_t  st_blocks;      /* Number of 512B blocks allocated */

                                   /* Since Linux 2.6, the kernel supports nanosecond

                  precision for the following timestamp fields.

                  For the details before Linux 2.6, see NOTES. */

               struct timespec st_atim;  /* Time of last access */

               struct timespec st_mtim;  /* Time of last modification */

               struct timespec st_ctim;  /* Time of last status change */

           #define st_atime st_atim.tv_sec      /* Backward compatibility */

           #define st_mtime st_mtim.tv_sec

           #define st_ctime st_ctim.tv_sec

           };

1、文件类型(可以用以下的宏确定文件类型,这些宏的参数都是struct stat结构中的ts_mode成员)

S_ISREG(m)  is it a regular file?

S_ISDIR(m)  directory?

S_ISCHR(m)  character device?

S_ISBLK(m)  block device?

S_ISFIFO(m) FIFO (named pipe)?

S_ISLNK(m)  symbolic link? (Not in POSIX.1-1996.)

S_ISSOCK(m) socket? (Not in POSIX.1-1996.)

2、文件权限

       存放在st_mode低9位,从高位到低位分别表示用户权限、同组用户权限、其它用户权限,该位为1表示有权限,0表示没有权限

3、链接数

直接通过st_nlink得到

4、文件所有者

getpwuid函数相关操作得到

5、文件所属组

getgrgid函数相关操作得到

6、文件字节大小

直接通过st_size得到

7、文件更新时间

ctime(&st_ctime)得到文件的更新时间

#include <stdio.h>
#include <sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<string.h>
#include<pwd.h>
#include<grp.h>
#include<time.h>
int main(int argc, char *argv[])
{
   if(2!=argc)
    {
        printf("error\n");
    }
    struct stat st;
    lstat(argv[1],&st);
    if(S_ISREG(st.st_mode))
        printf("-");
    else if (S_ISDIR(st.st_mode))
        printf("d");
    else if(S_ISLNK(st.st_mode))
        printf("l");
    int i=8;
    for ( ; i >= 0; i-=3)
    {
        if(st.st_mode&1<<i!=0)
           printf("r");
        else
            printf("-");

        if(st.st_mode&1<<(i-1)!=0)
            printf("w");
        else
            printf("-");
        if(st.st_mode&1<<(i-2)!=0)
            printf("x");
        else
            printf("-");

    }
//用户名
    struct passwd *pw=getpwuid(st.st_uid);
//链接数    
printf(" %ld",st.st_nlink);
    printf(" %s ",pw->pw_name);
struct group *gr =getgrgid(st.st_gid);
//用户组名    
printf( "%s",gr->gr_name);
//长度    
printf(" %ld",st.st_size);
    char arr[100]={0};
//获取时间
    strcpy(arr,ctime(&st.st_mtime));
    if(arr[strlen(arr)-1]=='\n')
        arr[strlen(arr)-1]='\0';
    printf(" %s ",arr);
    puts("");
    return 0;

}

2、目录文件函数

    1opendir

       作用:

           打开一个目录文件

       头文件

           #include<sys/types.h>

           #include<dirent.h>

       函数原型:

           DIR *opendir(const char *name)

       参数:

           name:目录文件

       返回值:

           成功返回目录流指针,失败返回 NULL并设置错误号。

IO进程线程,文件IO(open),文件(stat)与目录(opendir)属性的读取,算法,linux,文件IO

    2、readdir

    作用:

       读取目录当中一个文件的属性

    头文件:

       dirent.h

    函数文件

       struct dirent *readdir(DIR * dirp);

    参数:

       dirp:想要操作的目录流指针

    返回值:

       成功返回读取到的文件的相关信息的地址,被保存在一个struct dirent结构体中,失败或者读完了所有文件的返回NULL

相关结构体:

struct dirent {

               ino_t          d_ino;       /* Inode number */

               off_t          d_off;       /* Not an offset; see below */

               unsigned short d_reclen;    /* Length of this record */

               unsigned char  d_type;      /* Type of file; not supported

                                              by all filesystem types */

               char           d_name[256]; /* Null-terminated filename */

           };

       3、closedir

       作用:

              关闭目录流指针

       头文件:

              #include <sys/types.h>

                  #include <dirent.h>

       函数原型:

              int closedir(DIR *dirp);

       参数:

              dirp:目录流指针

       返回值:

       成功返回0,失败返回-1并设置错误号

IO进程线程,文件IO(open),文件(stat)与目录(opendir)属性的读取,算法,linux,文件IO

IO进程线程,文件IO(open),文件(stat)与目录(opendir)属性的读取,算法,linux,文件IO文章来源地址https://www.toymoban.com/news/detail-671771.html

到了这里,关于IO进程线程,文件IO(open),文件(stat)与目录(opendir)属性的读取的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • IO 与进程线程

    2023年05月28日
    浏览(42)
  • IO进程线程Day8

    使用信号灯集完成三个进程的同步,A进程输出字符A,B进程输出字符B,C进程输出字符C,要求输出结果为ABCABCABCABCABC...

    2024年01月25日
    浏览(51)
  • IO进程线程day4作业

    代码: 运行结果:  

    2024年02月21日
    浏览(54)
  • IO进程线程作业day2

    使用fread和fwrite完成两个图片文件的拷贝 现象展示:  使用read、write完成两个图片文件的拷贝 效果图   3 将时间在文件中跑起来 1、17:30:41 2、17:30:42 3、17:30:43 键入ctrl+c,结束进程后 ... 4、17:35:28 5、17:35:29 效果图:  思维导图

    2024年02月19日
    浏览(38)
  • IO进程线程day3(2023.7.31)

    文件描述符概念: 练习1:用fread和fwrite实现文件拷贝  练习2:time 功能:从1970-1-1日至今的秒数 原型: 参数: 返回值: 练习3:localtime 功能:将1970-1-1日至今的秒数转换成日历格式 原型: 参数: 返回值: 例题:  练习4:文件描述符的总量 练习5:open 功能:打开一个文件

    2024年02月14日
    浏览(32)
  • IO进程线程day8(2023.8.6)

    管道的原理: 有名管道的特点:  信号的原理: 练习1:pipe 功能:创建一个无名管道,同时打开无名管道的读写端 原型: 参数: 返回值: 小练:  练习2:mkfifo 功能:创建一根有名管道 原型: 参数: 返回值: 练习3:操作有名管道 功能:操作有名管道与用文件IO操作普通

    2024年02月14日
    浏览(36)
  • IO进程线程第五天(8.2)进程函数+XMind(守护进程(幽灵进程),输出一个时钟,终端输入quit时退出时钟)

    1.守护进程(幽灵进程) 2.输出一个时钟,终端输入quit时退出时钟        

    2024年02月14日
    浏览(47)
  • mv: 无法获取“/opt/module/hadoop/logs/hadoop-atguigu-nodemanager-hadoop102.out.1“ 的文件状态(stat): 没有那个文件或目录

    最近在回顾之前做过的离线数仓项目,在启动hadoop时出现了如下错误: 经过一些资料搜集发现问题的根本原因在于/opt/module/hadoop/etc/hadoop/目录下的workers文件配置出现错误。 文件内容不能够包含localhost 我原本的文件配置如下: 修改后配置如下: 我们简单解释一下workers文件的

    2024年02月05日
    浏览(50)
  • 文件IO,目录IO的学习

    用法:#include“head.h”    -     在当前目录下寻找头文件 主函数的传参中,argc是传参的个数  ,const char *argv[]是一个指针数组,存放的指针类型数据 argv【n】,n=1/2/3 分别代表三个指针参数 标准示例:     off_t lseek(int fd, off_t offset, int whence);        功能:            

    2024年02月20日
    浏览(29)
  • 目录打开显示提示文件或目录损坏且无法读取、文件或目录损坏且无法读取的破解之道

        咱们在平日工作时,通常都会将资料放进不同的目录中,方便咱们找到,随着时间的推移就会产生有越来越多目录。最近有位用户了这样一个问题,就是目录无论怎么都无法打开,这样就无法浏览、使用里面的资料了,影响到了咱们的正常使用,那目录文件或目录损坏且

    2024年02月02日
    浏览(89)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包