linux 系统函数调用:open close read write lseek

  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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/382520.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PyCharm安装和配置教程

文章目录官网链接错误类型&#xff01;1.你的用户名是中文解决方案PyCharm的汉化和配置PyCharm的简单使用入门PyCharm和git安装教程官网链接 www.jetbrains.com 错误类型&#xff01;1.你的用户名是中文 安装第一次各种问题&#xff01;就不多了&#xff0c;反正各种报错 原…

linux 进程通信 pipe

pipe函数 管道函数 man pipe #include <unistd.h> int pipe(int pipefd[2]);参数介绍&#xff1a;pipefd读写文件描述符&#xff0c;0-代表读&#xff0c; 1-代表写父子进程实现pipe通信&#xff0c;实现ps aux | grep bash 功能 经常出现的问题&#xff1a; 父进程认为…

软件工程学习笔记《二》代码规范

文章目录软件工程学习笔记目录google代码规范节选python来自google翻译错误注释的示例命名规范import语句的规范import this 源码软件工程学习笔记目录 [https://blog.csdn.net/csdn_kou/article/details/83754356] google代码规范 https://github.com/google/styleguide 节…

Linux 进程通信之FIFO

FIFO通信&#xff08;first in first out&#xff09; FIFO 有名管道&#xff0c;实现无血缘关系进程通信。 ----创建一个管道的伪文件 a.mkfifo testfifo 命令创建 b.也可以使用函数int mkfifo(const char *pathname, mode_t mode); ----内核会针对fifo文件开辟一个缓冲区&…

PyCharm和git安装教程

文章目录先到官网下载git进入setting&#xff0c;如黄色部分如果你用的是github那么直接setting登陆就行了如果你是gitee的话首先进入setting然后Plugins点击browse查找gitee如图所示&#xff01;最后点击重启ok《不要自己关闭&#xff0c;否则安装失败》安装好了以后,输入你的…

linux 进程通信子mmap

mmap 文件–内存映射 函数原型 #include <sys/mman.h>void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);参数介绍&#xff1a; add 传 NULL length 映射区的长度 protPROT_READ 可读PROT_WRITE可写 flagsMAP_SHARED 共享的&#xff0c…

malloc和calloc的区别

是否对申请的区域进行初始化而已 但是我想你也知道我们写程序的时候多用malloc而很少用calloc&#xff0c;何解&#xff1f; 因为calloc虽然对内存进行了初始化&#xff08;全部初始化为0&#xff09;&#xff0c;但是同样也要降低效率的 calloc相当于 p malloc(); memset(p,…

linux信号学习02

未决信号集与阻塞信号集(信号屏蔽字) 阻塞信号集&#xff1a; 将某些信号加入集合&#xff0c;对他们设置屏蔽&#xff0c;当屏蔽x信号后&#xff0c;再收到该信号&#xff0c;该信号的处理将推后(解除屏蔽后) 未决信号集&#xff1a; a. 信号产生&#xff0c;未决信号集中描述…

task_struct 结构如何查看及分析

cd /find -name sched.hvim usr/src/kernels/3.10.0862.6.3.el7.x86_64/include/linux/sched.hhttps://www.cnblogs.com/zxc2man/p/6649771.html 进程是处于执行期的程序以及它所管理的资源&#xff08;如打开的文件、挂起的信号、进程状态、地址空间等等&#xff09;的总称。…

linux 与信号集操作相关的函数

与信号集操作相关的函数 #include <signal.h> 清空信号集 全都为0 int sigemptyset(sigset_t *set);填充信号集 全都为1 int sigfillset(sigset_t *set);添加某个信号到信号集 int sigaddset(sigset_t *set, int signum);从集合中删除某个信号 int sigdelset(sigset_t *s…

软件工程学习笔记《三》代码优化和性能测试

文章目录软件工程学习笔记目录如何在开源社区提问&#xff1f;代码审查代码优化运行结果参数解释代码优化原则对常见的数据结构排序算法进行测试关于冒泡排序优化的探讨结果软件工程学习笔记目录 [https://blog.csdn.net/csdn_kou/article/details/83754356] 如何在开源社区提…

linux信号捕捉

信号捕捉&#xff0c;防止进程意外死亡 signal函数 man signal #include <signal.h> typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler);参数介绍&#xff1b; signum 要捕捉的信号 handler 要执行的捕捉函数指针&#xff0c…

软件工程学习笔记《目录》

软件工程学习笔记《目录》 软件工程学习笔记《一》什么是软件工程 软件工程学习笔记《二》代码规范 软件工程学习笔记《三》代码优化和性能测试 软件工程学习笔记《四》需求分析

linux进程利用SIGCHLD信号,来实现父进程回收子进程

子进程执行完毕后&#xff0c;会向父进程发出 SIGCHLD信号 &#xff0c; 这段代码实现的就是i&#xff0c;父进程接受到子进程 发出的SIGCHLD信号&#xff0c;实现对子进程进行回收&#xff0c;从而避免僵尸进程 #include <stdio.h> #include <unistd.h> #include…

WWW软件全球使用排名

https://w3techs.com/technologies/overview/web_server/all Apache份额一直下降呀&#xff01;

软件工程学习笔记《四》需求分析

文章目录软件工程学习笔记《目录》需求工程师当代的需求工程师需要具备的能力当代的需求工程师需要努力的方向当代的需求工程师需要注意的错误需求的定义需求目标需求分析的实质需求分析的关键应该涵盖的内容&#xff1f;需求规约&#xff08;作为较客观的参照&#xff09;单个…

linux守护进程

先了解 linux系统中 会话的概念 会话是进程组的更高一级&#xff0c;多个进程组对应一个会话。 会话是一个或多个进程组的集合 创建一个会话需要注意以下5点事项&#xff1a; a. 调用进程不能是进程组组长&#xff0c; 该进程变成新会话首进程&#xff08;session header&#…

python3爬虫学习笔记

文章目录python3的文本处理jieba库的使用统计hamlet.txt文本中高频词的个数统计三国演义任务高频次数爬虫爬取百度首页爬取京东某手机页面BeautifulSoup使用request进行爬取&#xff0c;在使用 BeautifulSoup进行处理&#xff01;拥有一个更好的排版BeautifulSoup爬取百度首页原…

linux 线程学习初步01

线程的概念 进程与线程内核实现 通过函数clone实现的 ps -Lf pidLinux内核线程实现原理 同一个进程下的线程&#xff0c;共享该进程的内存区&#xff0c; 但是只有stack区域不共享。 线程共享资源 a.文件描述符表 b.每种信号的处理方式 c.当前工作目录 d.用户id和组id 线程…

python3字符串处理,高效切片

高级技巧&#xff1a;切片&#xff0c;迭代&#xff0c;列表&#xff0c;生成器 切片 L [Hello, World, !]print("-------1.一个一个取-------") print(L[0]) print(L[1]) print(L[2])print("-------2.开辟一个新列表把内容存进去-------") r [] for i…