Linux系统编程 |
您所在的位置:网站首页 › dup函数返回值 › Linux系统编程 |
Linux系统编程-文件和目录操作函数
目录学习目标文件操作相关函数stat函数(重点)access函数chmod函数chown函数truncate函数link函数symlink函数readlink函数unlink函数rename函数
文件描述符复制(重点)概述dup函数dup2函数示例分析
fcnlt函数目录相关操作(掌握)getcwd函数chdir函数opendir函数closedir函数readdir函数时间相关函数
目录
学习目标
了解概念: pcb和文件描述符,虚拟地址空间了解Linux系统常用IO函数(暂不要求能够使用)熟练掌握Linux系统IO函数的使用了解阻塞和非阻塞的概念 掌握dup、dup2函数的使用熟练掌握Linux系统IO函数的使用掌握stat/lstat函数的使用掌握fcntl函数的使用
文件操作相关函数
stat函数(重点)
#include
#include
#include
int stat(const char *path, struct stat *buf);
int lstat(const char *pathname, struct stat *buf);
功能:
获取文件状态信息
stat和lstat的区别:
当文件是一个符号链接时,lstat返回的是该符号链接本身的信息;
而stat返回的是该链接指向的文件的信息。
参数:
path:文件名
buf:保存文件信息的结构体
返回值:
成功: 0
失败: -1
struct stat结构体说明: 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; //最后一次改变时间(指属性) };st_mode(16位整数)参数说明 dup() 和 dup2() 是两个非常有用的系统调用,都是用来复制一个文件的描述符,使新的文件描述符也标识旧的文件描述符所标识的文件。 这个过程类似于现实生活中的配钥匙,钥匙相当于文件描述符,锁相当于文件,本来一个钥匙开一把锁,相当于,一个文件描述符对应一个文件,现在,我们去配钥匙,通过旧的钥匙复制了一把新的钥匙,这样的话,旧的钥匙和新的钥匙都能开启这把锁。 对比于 dup(), dup2() 也一样,通过原来的文件描述符复制出一个新的文件描述符,这样的话,原来的文件描述符和新的文件描述符都指向同一个文件,我们操作这两个文件描述符的任何一个,都能操作它所对应的文件。 dup函数 #include int dup(int oldfd); 功能: 通过 oldfd 复制出一个新的文件描述符,新的文件描述符是调用进程文件描述符表中最小可用的文件描述符,最终 oldfd 和新的文件描述符都指向同一个文件。 参数: oldfd : 需要复制的文件描述符 oldfd 返回值: 成功:新文件描述符 失败: -1 dup2函数 #include int dup2(int oldfd, int newfd); 功能: 通过 oldfd 复制出一个新的文件描述符 newfd,如果成功,newfd 和函数返回值是同一个返回值,最终 oldfd 和新的文件描述符 newfd 都指向同一个文件。 参数: oldfd : 需要复制的文件描述符 newfd : 新的文件描述符,这个描述符可以人为指定一个合法数字(0 - 1023),如果指定的数字已经被占用(和某个文件有关联),此函数会自动关闭 close() 断开这个数字和某个文件的关联,再来使用这个合法数字。 返回值: 成功:返回 newfd 失败:返回 -1 示例分析fcntl函数有5种功能: 复制一个现有的描述符(cmd=F_DUPFD)获得/设置文件描述符标记(cmd=F_GETFD或F_SETFD)获得/设置文件状态标记(cmd=F_GETFL或F_SETFL)获得/设置异步I/O所有权(cmd=F_GETOWN或F_SETOWN)获得/设置记录锁(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); //设置文件状态标记 目录相关操作(掌握) getcwd函数 #include char *getcwd(char *buf, size_t size); 功能:获取当前进程的工作目录 参数: buf : 缓冲区,存储当前的工作目录 size : 缓冲区大小 返回值: 成功:buf中保存当前进程工作目录位置 失败:NULL chdir函数 #include int chdir(const char *path); 功能:修改当前进程(应用程序)的路径 参数: path:切换的路径 返回值: 成功:0 失败:-1 opendir函数 #include #include DIR *opendir(const char *name); 功能:打开一个目录 参数: name:目录名 返回值: 成功:返回指向该目录结构体指针 失败:NULL closedir函数 #include #include int closedir(DIR *dirp); 功能:关闭目录 参数: dirp:opendir返回的指针 返回值: 成功:0 失败:-1 readdir函数 #include struct dirent *readdir(DIR *dirp); 功能:读取目录 参数: dirp:opendir的返回值 返回值: 成功:目录结构体指针 失败:NULL 相关结构体说明: struct dirent { ino_t d_ino; // 此目录进入点的inode off_t d_off; // 目录文件开头至此目录进入点的位移 signed short int d_reclen; // d_name 的长度, 不包含NULL 字符 unsigned char d_type; // d_type 所指的文件类型 char d_name[256]; // 文件名 };d_type文件类型说明: 取值含义DT_BLK块设备DT_CHR字符设备DT_DIR目录DT_LNK软链接DT_FIFO管道DT_REG普通文件DT_SOCK套接字DT_UNKNOWN未知 时间相关函数utime time char *asctime(const struct tm *tm); char *asctime_r(const struct tm *tm, char *buf); char *ctime(const time_t *timep); char *ctime_r(const time_t *timep, char *buf); struct tm *gmtime(const time_t *timep); struct tm *gmtime_r(const time_t *timep, struct tm *result); struct tm *localtime(const time_t *timep); struct tm *localtime_r(const time_t *timep, struct tm *result); time_t mktime(struct tm *tm); |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |