1. open函数
    查看函数原型 man 2 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);

相关参数用法介绍;

a.   pathname 文件名
b. flags必选项:O_RDONLY 只读O_WRONLY 只写O_RDWR   读写可选项:O_APPEND 追加O_CREAT  创建文件O_EXCL 与 O_CREAT 一起使用,如果文件存在,则报错mode 权限位,最终(mode & ~umask)O_NONBLOCK 非阻塞返回值:返回最小的可用文件描述符,失败返回-1, 设置errno
  1. close 函数
    man 2 close
 #include <unistd.h>int close(int fd);

参数介绍: fd为要关闭的文件描述符
返回值:成功返回0, 失败返回-1, 设置errno

ps:C语言参数使用 | 可以有多项参数的实现原理,实际上就是位符
比如:int 类型 32个位,哪几个位代表那几个含义

  1. read函数
    man 2 read
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
参数介绍:fd 文件描述符buf 缓冲区count 缓冲区大小
返回值:失败返回-1,设置errno成功返回读到的大小0代表读到文件末尾非阻塞情况下:read返回-1,但是此时需要判断errno的值,看是否是因为非阻塞的原因导致返回-1

非阻塞情况下:
read返回-1,但是此时需要判断errno的值,看是否是因为非阻塞的原因导致返回-1
这里回头再学习以下 ???
代码示例,使用read函数实现 linux cat命令的功能

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
int main(int arg, char *argv[]) {if(arg != 2)  {printf("./a.out filename\n");return -1;}int fd = opeޙn(argv[1], O_RDONLY);if(fd == -1) {printf("not found filename\n");return -1;}char buf[256];int read_ret = read(fd, buf, sizeof(buf));while (read_ret > 0){printf("%s", buf);memset(buf, '\0', sizeof(buf));read_ret = read(fd, buf, sizeof(buf));  }close(fd);return 0;
}

注意使用这一行代码memset(buf, ‘\0’, sizeof(buf));
不然最后一次输出buf,会出现多余的情况 ,暨每次使用完buf,都清洗一次。

  1. wirte
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
参数介绍:fd 文件描述符buf 缓冲区count 缓冲区大小
返回值:成功,返回写入的字节数失败,返回-1,设置errno0, 代表未写入
  1. lseek函数
    移动文件读写位置
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
参数介绍:fd文件描述符offset 偏移量whence SEEK_SET 文件开始位置SEEK_CUR 当前位置SEEK_END 结尾返回值:成功:返回当前位置到开始的长度失败:返回-1,设置errno

以下代码示例:
将一个字符串helloworld,写到一个文件里面,读取出来,输出在屏幕上

de <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>int main(int argc, char *argv[]) {if(argc != 2) {printf("./a.out filename1");return -1;}int fd = open(argv[1], O_RDWR|O_CREAT, 0666);char *w_temp = "helloworld";int length = strlen(w_temp);int write_ret = write(fd, w_temp, length);if(write_ret>0) {printf("write bytes of %d\n", length);} else {printf("write error\n");return -1;}char r_temp[256];int seek_ret = lseek(fd, 0, SEEK_SET);if(seek_ret == -1) {printf("lseek error\n");return -1;}memset(r_temp, '\0', sizeof(r_temp));int read_ret = read(fd, r_temp, sizeof(r_temp));printf("%d\n", read_ret);if(read_ret !=-1){printf("read bytes of %d\n", strlen(r_temp));printf("read is\n");printf("%s\n", r_temp);} else {printf("read error\n");return -1;}write(STDOUT_FILENO, r_temp, strlen(r_temp));close(fd);return 0;
}

注意

int seek_ret = lseek(fd, 0, SEEK_SET);

将文件读写位置,重写设置为文件开始,不然以后的代码读取不到文件的内容。

lseek函数计算文件大小
代码示例:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int main(int argc, char *argv[]) {if(argc !=2) {printf("./a.out filename1\n");return -1;}int fd = open(argv[1], O_RDONLY);if(!fd) {printf("open error\n");return -1;}int file_size = lseek(fd, 0, SEEK_END);printf("%s file size is %d\n", argv[1], file_size);close(fd);return 0;
}

lseek 拓展文件
以下代码,创建一个新文件, 并且使其大小为1024字节。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>int main(int argc, char *argv[]) {if(argc!=2) {printf("./a.out filename1\n");return -1;}int fd = open(argv[1], O_WRONLY|O_CREAT, 0666);int l_ret = lseek(fd, 1023, SEEK_END);char a[1] = {'a'};// 这里必须要写一次,才能生效int w_ret = write(fd, a, 1); // or write(fd, "a", 1);close(fd);return 0;
}

代码举例:

  1. 同一个进程中,两次打开同一个文件,进行写操作
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>int main(int argc, char *argv[]) {if(argc != 2) {printf("./a.out filename1\n");return -1;}int o_ret = open(argv[1], O_RDWR|O_CREAT, 0666);printf("o_ret = %d\n", o_ret);int o_ret1 = open(argv[1], O_RDWR|O_CREAT, 0666);printf("o_ret1 = %d\n", o_ret1);write(o_ret, "hello", 5);lseek(o_ret1, 5, SEEK_CUR);// 这里注意lseek的用法,不然,下面的world,会把上面的hello覆盖掉write(o_ret1, "world", 5);int cl_ret = close(o_ret);int cl_ret1 = close(o_ret1);printf("cl_ret = %d\n", cl_ret);printf("cl_ret1 = %d\n", cl_ret1);return 0;
}

linux 系统函数调用:open close read write lseek相关推荐

  1. linux 系统函数调用脚本文件,Linux系统调用fsync函数详解

    Linux系统调用fsync函数详解 发布时间:2013-11-14 19:55:10   作者:佚名   我要评论 Linux fsync函数主要用于将同步内存中所有已修改的文件数据到储存设备,多用 ...

  2. linux系统编程:read,write与lseek的综合应用

    这个实例根据命令行参数进行相应的读学操作: 用法: usage:./io file {r<length>|R<length>|w<string>|s<offs ...

  3. Linux系统编程之查看文件大小的方法(lseek and stat)

    Linux系统编程之查看文件大小的方法:1.使用lseek函数,2.使用stat函数.直接上代码 #include <stdio.h> #include <stdlib.h> ...

  4. 【Linux系统编程学习】Linux系统IO函数(open、read、write、lseek)

    此为牛客网Linux C++课程1.20课程笔记. 1.open函数 open函数有两种,分别是打开一个已经存在的文件和创建并打开一个不存在的文件. #include <sys/types.h& ...

  5. 【Linux系统IO函数】lseek函数

    Linux系统IO函数-lseek函数 1.1 lseek函数与标准C库的fseek函数 lseek函数对应标准C库中的fseek函数 查看标准C库中的fseek函数使用说明: (shell输入) m ...

  6. Linux 系统 IO之 lseek 函数

    Linux 系统 IO之 lseek 函数 文章目录 Linux 系统 IO之 lseek 函数 1. lseek 函数 1.1 头文件包含 1.2 函数原型 1.3 函数功能 1.4 函数返回值 1 ...

  7. linux用Lseek函数 拷贝文件,linux系统下lseek函数的详细用法

    前面的文章里面,仔细讲了在linux系统对文件的读写操作以及文件管理,为今天要讲的内容作了铺垫(如果您是刚接触这方面的内容,可以先看我之前写的文章,有错误的地方,还望指出来,在这里先说一声谢谢).好了 ...

  8. Linux系统编程 | 01 -文件操作

    一.文件操作方法 linux中有两种方法可以操作文件:系统调用和c库函数. 1. 什么是系统调用? 由操作系统实现并提供给外部应用程序的编程接口(API),是应用程序同系统之间数据交互的桥梁. C标准 ...

  9. 黑马linux系统编程

    目录 1.shell: 1.常见shell: 2.主键盘快捷键 2.目录和文件 head: 3.文件属性和用户用户组 4.查找与检索 zip压缩: 5.vim编辑器 6 .gcc编译: 7.静态库的制 ...

最新文章

  1. Linux——挖矿病毒(sysupdate, networkservice进程)清除解决方案
  2. mysql数据库入门教程(9):数据的常见约束
  3. 基于Kafka+Flink+Redis的电商大屏实时计算案例
  4. Pytorch快速入门笔记
  5. linux运行级别与服务
  6. c++频繁读取数据会丢失_透析中会丢失什么营养?透析日的饮食需要注意什么?...
  7. mysql 一个文章多个分类_jdbc mysql 插入一篇文章并与多个标签,一个分类建立关联关系。...
  8. win11更新后黑屏怎么办 Windows11更新后黑屏的解决方法
  9. Julia: Atom 来了!如何在Atom中操作Julia?
  10. 怎么用计算机算钱,亚马逊fba费用计算器要怎么使用?
  11. windows7环境下VS2010中文版本配置MPI开发环境图文教程
  12. 电脑变慢,电脑越来越慢怎么办 电脑用久了网速变慢如何解决
  13. 我们已经开发好了Magento的Ctopay(收汇宝)非3D网关
  14. Vue解决导出pdf文件图片展示不全问题
  15. c语言1ms延时程序,请教老师,51微控制器在12M晶振,C语言程式设计时,延时函式120次=1ms(书本上是这样的,不懂),是怎样得来的?...
  16. vivo手机如何投屏到电脑
  17. java-计算球体积
  18. 射频电路板设计常见的问题分析和解决办法
  19. android 推送历史 coolapk,酷安(com.coolapk.market) - 11.2.2 - 应用 - 酷安
  20. 【联邦学习FATE框架实战】(二)用FATE从零开始实现横向逻辑回归

热门文章

  1. Vuejs开发环境搭建及热更新
  2. VS2010中预处理器定义
  3. 关于常用的编码工具如何引入jar包
  4. JavaScript之面向对象学习六原型模式创建对象的问题,组合使用构造函数模式和原型模式创建对象...
  5. Mercurial hg web server的配置
  6. LazyInitializationException--由于session关闭引发的异常
  7. Response.Write具体介绍
  8. No identities are available for signing 的解决办法
  9. 提升应用视觉Android效果的10个UI技巧
  10. extjs中xtype类型