Linux 常用系统函数

1. Linux系统IO函数

  • open函数

    // 打开文件(存在)
    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_APPEND: 追加, 写文件时候用的
                O_CREAT: 文件如果不存在, 创建新文件
                O_EXCL: 检测打开的文件是否存在, 必须和O_CREAT一起使用
                    - 创建的文件的时候检测文件是否存在
                    	- 不存在, 创建
                    	- 存在, 函数调用失败
        - mode: 创建的文件的权限, 八进制数  0777
             最终权限: (mode & ~umask)
    返回值: 成功: 打开的文件的文件描述符  , 失败: -1  
    
    
  • close函数

    #include <unistd.h>
    // 参数是open的返回值
    int close(int fd);
    
  • read函数

    ssize_t read(int fd, void *buf, size_t count);
    参数:
    	- fd: open之后得到返回值 == 文件描述符
        - buf: 存储从文件中读出的数据, 数组的地址
        - count: buf的最大容量, 计算方式: sizeof(buf)
    返回值:
    	失败: -1
        成功: 
    		>0: 返回值读到的字节数
            ==0: 文件读完了
    
  • write函数

    ssize_t write(int fd, const void *buf, size_t count);
    参数:
    	- fd: open之后得到返回值 == 文件描述符
        - buf: 要写入到文件中的数据
        - count: buf中数据的长度, strlen(buf)
            
    返回值:
    	失败: -1
        成功: 
    		>0: 成功写入到文件中的字节数
            ==0: 往文件中写入了0字节
    
  • lseek函数

    #include <sys/types.h>
    #include <unistd.h>
    off_t lseek(int fd, off_t offset, int whence);
    参数:
    	- fd: open之后得到返回值 == 文件描述符
        - offset: 偏移量
        - whence:, 控制偏移量如何使用
            SEEK_SET: 
    			从文件头偏移 offset 个字节
            SEEK_CUR:
    			偏移量 = 文件指针当前位置 + 参数offset
            SEEK_END:
    			偏移量 = 文件大小 + 参数 offset
    返回值: 成功: 最终得到的偏移, 失败: -1
    
  • truncate/ftruncate函数

    #include <unistd.h>
    #include <sys/types.h>
    // 文件拓展或截断
    int truncate(const char *path, off_t length);
    	- path: 操作的磁盘文件
        - length: 文件的最终大小
            	length>原大小  -> 文件拓展
            	length<原大小  -> 文件截断
    int ftruncate(int fd, off_t length);
    

2. 其他系统函数

2.1 stat函数

	#include <sys/types.h>
	#include <sys/stat.h>
	#include <unistd.h>
	
	struct stat{}
	int stat(const char *pathname, struct stat *buf);
	参数: 
		- pathname: 要操作的文件名字
	    - buf: 传出参数
	返回值: 成功0, 失败-1

2.2 目录遍历函数

  • opendir/closedir函数

    #include <dirent.h>
    // 打开目录
    // 参数: name: 要打开的目录的名字
    // 返回值: 目录指针, 如果失败返回NULL
    DIR *opendir(const char *name);
    
    // 关闭目录
    int closedir(DIR *dirp);
    //参数是 opendir 的返回值
    
  • readdir函数

    #include <dirent.h>
    struct dirent {
    	ino_t          d_ino;       /* 通过这个变量找到文件在磁盘位置 */
        off_t          d_off;       /* 偏移量, 用不到 */
        unsigned short d_reclen;    /* 变量d_name中存储的实际数据长度 */
        unsigned char  d_type;      /* 当前文件的类型 */
        char           d_name[256]; /* 当前文件的文件名 */
    };
    
    /*文件类型 d_type :
    	   DT_BLK      This is a block device.
           DT_CHR      This is a character device.
           DT_DIR      This is a directory.
           DT_FIFO     This is a named pipe (FIFO).
           DT_LNK      This is a symbolic link.
           DT_REG      This is a regular file.
           DT_SOCK     This is a UNIX domain socket.
           DT_UNKNOWN  The file type is unknown.*/
    
    // 参数: dirp: opendir 的返回值
    // 返回值: 结构体, 这个结构体对应读到的目录中的磁盘文件
    // 目录中一般是有多个文件的, 如果想全部读出, 需要遍历, 遍历当前目录需要循环处理
    // 如何知道目录中的所有文件遍历完了, 如果readdir 返回NULL, 代表遍历完成
    struct dirent *readdir(DIR *dirp);
    

2.3 其他函数

  • dup函数---->复制文件描述符

    // 参数 oldfd 被复制的文件描述符
    // 返回值: 新的文件描述符
    // 参数oldfd和返回值得到的newfd可以操作同一个磁盘文件
    int dup(int oldfd);
    
  • dup2函数

    int dup2(int oldfd, int newfd);
    	场景1:(最常用)
    		oldfd -> 对应打开的磁盘文件a.txt
            newfd -> 对应打开的磁盘文件b.txt
            这中情况下重定向: newfd和b.txt断开, b.txt打开的文件关闭, newfd指向 a.txt
       场景2:
    		oldfd -> 对应打开的磁盘文件a.txt
            newfd -> 不执行任何的磁盘文件
            这中情况下文件描述符复制: newfd指向 a.txt
       场景3:
    		oldfd和newfd 都指向 a.txt, 相当于什么也没做
    
  • fcntl函数

    int fcntl(int fd, int cmd, ... /* arg */ );
    参数:
    	- fd: 被操作的文件描述符
        - cmd: 要实现什么功能, 需要指定提供的宏值
    // 复制文件描述符
    	cmd: 
    		F_DUPFD -> 复制文件描述符
            int newfd = fcntl(fd, F_DUPFD);
    
    // 修改文件描述符对应的flag属性(最常用的情况)
    	cmd: 
    		F_GETFL -> 得到文件描述符的flag属性
            int flag = fcntl(fd, F_GETFL);
            F_SETFL -> 将新的flag属性设置给文件描述符
            	flag = flag | O_APPEND;
    			fcntl(fd, F_SETFL, flag);
    

fcntl函数常用于为文件描述符添加非阻塞属性

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值