【Linux】在Linux下文件io使用(二)

在linux下,一切皆文件。当文件被打开时,会返回文件描述符用于操作该文件,从shell中运行一个进程,默认会有3个文件描述符存在(0、1、2); 0表示标准输入,1表示标准输出,2表示标准错误。一个进程当前有哪些打开的文件描述符可以通过/proc/进程ID/fd目录查看

在文件夹下的系统调用

int mkdir(const char pathname,mode_t mode)创建文件夹int rmdir(const char pathname);删除文件夹DIR opendir(const char pathname);打开文件夹struct dirent readdir(DIR dp);读文件夹int closeddir (DIR dp);关闭文件夹int chdir(const char pathname);改变工作目录

其中readdir()系统调用的struct dirent定义如下:

struct dirent
{
long d_ino;
 off_t d_off;
 unsigned short d_reclen;
 unsigned char d_type;
 char d_name [NAME_MAX+1];
}

系统调用

creat

int creat (const char *pathname,mode_t mode);

他等价于:

open(pathname,O_CREAT | O_TRUNC | O_WRONLY,mode);
#include
#include
#include

int main()
{
    if( creat("/aicamel/boa/file.txt",0777) < 0 )
    {
        printf("文件创建失败!\n");
    } else
    {
        printf("文件创建成功!\n");
    }
    return 0;
}

dup()和dup2()

#include
int dup(int oldfd);
int dup2(int oldfd, int newfd);
功能:
  复制文件描述符,使多个文件描述符指向同一个文件。
返回值:
 成功:dup函数返回当前系统可用的最小整数值。
    dup2函数返回第一个不小于newfd的整数值。也就是分为两种情况:
    如果newfd已经打开,则先将其关闭,再复制文件描述符。
    如果newfd等于oldfd,则dup2返回newfd, 而不关闭它。

 失败:均返回-1,并设置errno
int main(int argc, char *argv)
{
        int            fd = -1;
        fd = open("test.txt",O_RDWR|O_CREAT|O_TRUNC,0666);
        if(fd < 0)
        {
                printf("Open file failure: %s\n",strerror(errno));
                return  0;
        }
        dup2(fd,STDIN_FILENO);
        dup2(fd , STDOUT_FILENO);
        dup2(fd,STDERR_FILENO);

        printf("fd=%d\n",fd);
        close(fd);
        return 0;
}

标准输入标准输入标准出错STDIN_FILENOSTDOUT_FILENOSTDERR_FILENOstdinstdoutstderr

可以看到fd=3,说明文件标准重定向成功

stat和fstat

这两个函数都是用来返回文件或目录的相关信息,只是stat()的第一个参数是文件名,而fstat()的第一个参数是文件打开的相应文件描述符

int stat(const char * restrict path, struct stat *restrict buf);
int fstat(int fd, struct stat *buf);
功能:
    两个函数都是用来返回文件或目录的相关信息
    restrict path: 参数是文件名
    fd :参数是文件打开的相应文件描述符

struct stat结构体如下

struct stat {
               dev_t     st_dev;
               ino_t     st_ino;
               mode_t    st_mode;
               nlink_t   st_nlink;
               uid_t     st_uid;
               gid_t     st_gid;
               dev_t     st_rdev;
               off_t      st_size;
               blksize_t   st_blksize;
               blkcnt_t   st_blocks;
               time_t    st_atime;
               time_t    st_mtime;
               time_t    st_ctime;

         };
#include
#include
#include
#include
int main (int argc, char **argv)
{
 struct stat stbuf;

 stat("stat.c", &stbuf);
 printf("File Mode: %o Real Size: %luB, Space Size: %luB\n", stbuf.st_mode,
 stbuf.st_size,stbuf.st_blksize);
 return 0;
}

access():判断文件的权限位

int access(const char *path,int mode);
        参数path 是访问文件所在的路径名,mode是访问判断模式,
具体含义如下:
  R_OK 只判断是否有读权限
  W_OK 只判断是否有写权限
  X_OK 判断是否有执行权限
  F_OK 只判断是否存在
功能:
    确定文件或文件夹的访问权限。如果指定的存取方式有效,则函数返回0,否则函数返回-1。
#include
#include

#define TEST_FILE "access.c"

int main(void)
{
    if( access(TEST_FILE, F_OK)!=0 )
    {
    printf("File %s not exist!\n", TEST_FILE);
    return 0;
    }
    printf("File %s exist!\n", TEST_FILE);
    if(access(TEST_FILE, R_OK)==0)
    printf("READ OK\n");
    if(access(TEST_FILE, W_OK)==0)
    printf("WRITE OK\n");
    if(access(TEST_FILE, X_OK)==0)
    printf("EXEC OK\n");
    return 0;
}

mkdir()创建一个文件夹

函数原型如下:
        int mkdir(const char *pathname, mode_t mode);
函数说明:
        mkdir()函数以mode方式创建一个以参数pathname命名的目录,mode定义新创建目录的权限。
返回值:
        若目录创建成功,则返回0;否则返回-1,并将错误记录到全局变量errno中。
 if(mkdir(TXT_DIR,0755)<0)
        {
                printf("创建新的'%s'文件夹失败:%s\n",TXT_DIR,strerror(errno));
                return -1;
        }

chdir()改变工作目录

chdir 是C语言中的一个系统调用函数(同cd),用于改变当前工作目录
其参数为Path 目标目录,可以是绝对目录或相对目录。
int  chdir(const char *path);
   -参数*path;文件路径
   -返回值;成功返回0,错误返回-1
if(chdir(TXT_DIR)<0)
        {
                printf("更改目录'%s'文件失败:%s\n",TXT_DIR,strerror(errno));
                rv = -2;
                goto cleanup;
        }

opendir()打开一个文件夹

函数原型
  DIR* opendir (const char * path );
  获取path子目录下的所由文件和目录的列表,如果path是个文件则返回值为NULL
功能
  打开一个目录,在失败的时候返回一个空的指针。
DIR 结构体的原型为:struct_dirstream
在linux系统中:

    typedef struct __dirstream DIR;

   struct __dirstream
   {
     void *__fd;
     char *__data;
     int __entry_data;
     char *__ptr;
     int __entry_ptr;
     size_t __allocation;
     size_t __size;
     __libc_lock_define (, __lock)
    };

 if((dirp = opendir(TXT_DIR))==NULL)
        {
                printf("打开'%s'文件夹失败:%s\n",TXT_DIR,strerror(errno));
                rv = -6;
                goto cleanup;
        }
        while((direntp = readdir(dirp)) !=NULL)
        {
                printf("文件夹所以的文件:%s\n",direntp->d_name);
        }

readdir()在文件夹下所以文件的信息

函数原型
    struct dirent* readdir(DIR* dir_handle); (个人理解循环读取dir,文件夹和文件都读)
功能
    读取opendir 返回值的那个列表
返回值
返回dirent结构体指针,dirent结构体成员如下,(文件和目录都行)

dirent的结构体

struct dirent
{
    ino_t d_ino;
    ff_t d_off;
    signed short int d_reclen;
    unsigned char d_type;
    har d_name[256];
}

代码实现

#include
#include
#include
#include
#include
#include
#include
#include

#define TXT_DIR  "dir"

int main(int argc, char **argv)
{
        int     fd1;
        int     rv ;
        int     fd2;
        DIR     *dirp;
        struct  dirent  *direntp;

        if(mkdir(TXT_DIR,0755)<0)
        {
                printf("创建新的'%s'文件夹失败:%s\n",TXT_DIR,strerror(errno));
                return -1;
        }
        if(chdir(TXT_DIR)<0)
        {
                printf("更改目录'%s'文件失败:%s\n",TXT_DIR,strerror(errno));
                rv = -2;
                goto cleanup;
        }
        if((fd1 = creat("test1.txt",0644))<0)
        {
                printf("文件创建失败:%s\n",strerror(errno));
                rv = -3;
                goto cleanup;

        }
        if((fd2 = creat("test2.txt",0644))<0)
        {
                printf("文件创建文件失败:%s\n",strerror(errno));
                rv = -4;
                goto cleanup;

        }
        if(chdir("../")<0)
        {
                printf("更改目录到父'%s'文件夹下:%s\n",TXT_DIR,strerror(errno));
                rv = -5;
                goto cleanup;
        }
        if((dirp = opendir(TXT_DIR))==NULL)
        {
                printf("打开'%s'文件夹失败:%s\n",TXT_DIR,strerror(errno));
                rv = -6;
                goto cleanup;
        }
        while((direntp = readdir(dirp)) !=NULL)
        {
                printf("文件夹所以的文件:%s\n",direntp->d_name);
        }

        closedir(dirp);

cleanup:
        if(fd1 >=0)
        {
                close(fd1);
        }
        if(fd2 >=0)
        {
                close(fd2);
        }
}

代码运行成功后,显示(test1.txt test2.txt … .)这四种文件

Original: https://www.cnblogs.com/Ye-Wei/p/16728611.html
Author: 西故黄鹤楼
Title: 【Linux】在Linux下文件io使用(二)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/606320/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球