Linux系统编程之“函数秘籍”

118 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 17 天,点击查看活动详情

前言

本篇文章整理了一些Linux系统编程里经常用到的那些函数,供有需要的朋友们来参考学习,如发现描述不当或者有错误的地方,欢迎批评指正,期待大家补充更多的条例一起学习。

一、open函数

  • int open(char *pathname, int flags) #include <unistd.h>

    参数:

    pathname: 欲打开的文件路径名

    flags:文件打开方式: #include <fcntl.h>

    O_RDONLY|O_WRONLY|O_RDWR O_CREAT|O_APPEND|O_TRUNC|O_EXCL|O_NONBLOCK ....

    返回值:

    成功: 打开文件所得到对应的 文件描述符(整数)

    失败: -1, 设置errno

  • int open(char *pathname, int flags, mode_t mode) 123 775

    参数:

    pathname: 欲打开的文件路径名

    flags:文件打开方式:

    O_RDONLY|O_WRONLY|O_RDWR O_CREAT|O_APPEND|O_TRUNC|O_EXCL|O_NONBLOCK ....

    mode: 参数3使用的前提, 参2指定了 O_CREAT。 取值8进制数,用来描述文件的 访问权限。 rwx 0664

    创建文件最终权限 = mode & ~umask

    返回值:

    成功: 打开文件所得到对应的 文件描述符(整数)

    失败: -1, 设置errno

二、close函数

int close(int fd);

三、错误处理函数

注意 与errno 相关。

printf("xxx error: %d\n", errno);

char *strerror(int errnum);

	printf("xxx error: %s\n", strerror(errno));

void perror(const char *s);

	perror("open error");

四、read函数

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

  • 参数:

    fd:文件描述符

    buf:存数据的缓冲区

    count:缓冲区大小

  • 返回值:

    0:读到文件末尾。

    成功; > 0 读到的字节数。

    失败: -1, 设置 errno

    -1: 并且 errno = EAGIN 或 EWOULDBLOCK, 说明不是read失败,而是read在以非阻塞方式读一个设备文件(网络文件),并且文件无数据。

五、write函数

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

  • 参数:

    fd:文件描述符

    buf:待写出数据的缓冲区

    count:数据大小

  • 返回值:

    成功; 写入的字节数。

    失败: -1, 设置 errno

六、lseek函数

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

  • 参数:

    fd:文件描述符

    offset: 偏移量

    whence:起始偏移位置: SEEK_SET/SEEK_CUR/SEEK_END

  • 返回值:

    成功:较起始位置偏移量

    失败:-1 errno

  • 应用场景:

    1. 文件的“读”、“写”使用同一偏移位置。

    2. 使用lseek获取文件大小

    3. 使用lseek拓展文件大小:要想使文件大小真正拓展,必须引起IO操作。

七、stat/lstat 函数

int stat(const char *path, struct stat *buf);

  • 参数:

    path: 文件路径

    buf:(传出参数) 存放文件属性。

  • 返回值:

    成功: 0

    失败: -1 errno

  • 获取文件大小: buf.st_size

  • 获取文件类型: buf.st_mode

  • 获取文件权限: buf.st_mode

  • 符号穿透:stat会。lstat不会。

八、目录操作函数:

示例程序如下

DIR * opendir(char *name);

int closedir(DIR *dp);

struct dirent *readdir(DIR * dp);

	struct dirent {

		inode

		char dname[256];
	}