Linux编程基础 2.1:Linux文件系统与操作

1 文件I/O

open()
read()
write()
lseek()
close()

1.1 open函数

#include <fcntl.h>
int open(const char *pathname, int flags[, mode_t mode);

open函数参数说明:

  • pathname:待打开文件的文件路径名;
  • flags:访问模式,常用的宏有:
    – O_RDONLY:只读
    – O_WRONLY: 只写
    – O_RDWR: 读写
    – O_CREAT: 创建一个文件并打开
    – O_EXCL: 测试文件是否存在,不存在则创建
    – O_TRUNC: 以只写或读写方式成功打开文件时,将文件长度截断为0
    – O_APPEND: 以追加方式打开文件

只有第二个参数flags = O_CREAT,第三个参数才会被用于设置新文件的权限,取值如下:

  • S_IRWXU: 文件所有者,读、写、执行
  • S_IRUSR: 文件所有者,读
  • S_IWUSR: 文件所有者,写
  • S_IXUSR: 文件所有者,执行
  • S_IRWXG: 文件所属组,读、写、执行
  • S_IRGRP: 文件所属组,读
  • S_IWGRP: 文件所属组,写
  • S_IXGRP: 文件所属组,执行
  • S_IRWXO: 其他人,读、写、执行
  • S_IROTH: 其他人,读
  • S_IWOTH: 其他人,写
  • S_IXOTH: 其他人,执行

返回值说明:

  • 调用成功,返回一个文件描述符
  • 不成功,返回-1

例: 创建一个文件

open(pathname, O_WRONLY|O_CREAT|O_TRUNC, mode);
or
int create(const char *pathname, mode_t mode);

【案例 1】创建一个文件,设置权限为0777。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
int main(){int tempFd;tempFd = open("abc", O_CREAT, 0777);printf("fd = %d\n", tempFd);return 0;
}//of main 

问题:为什么fd = 3? 为什么abc文件权限是775?
在这里插入图片描述

【案例 2】最多能打开多少个文件?

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
int main(int argc, char *argv[]){int tempFd;char tempName[1024];int i = 0;while (1) {sprintf(tempName, "file%d", ++i);tempFd = open(tempName, O_CREAT, 0777);if (tempFd == -1) {exit(1);}//of ifprintf("%d\n", i);}//of whilereturn 0;
}//of main 

问题:为什么是1021?不是1024?
在这里插入图片描述
答:因为有stdin, stdout, stderr三个文件默认打开

几个有用的命令:

  • cat /proc/sys/fs/file-max
    查看当前系统允许打开最大文件个数
  • ulimit –a
    当前默认设置最大打开文件个数1024
  • ulimit –n 4096
    修改默认设置最大打开文件个数为4096

1.2 read函数

#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);

read函数参数说明:

  • fd: 从open或create函数返回的文件描述符
  • buf: 缓冲区
  • count: 读取数据的字节数

返回值说明:

  • ssize_t: 有符号的size_t,有三种返回值
    – 正数:请求读取的字节数
    – 0: 文件长度有限,若读写位置距文件末尾只有20字节,该函数请求读取30字节,则第一次读取时返回值为20,第二次读取时,返回0
    – -1: 读取文件出错

特殊说明: read函数从设备或网络中读数据,如从终端读取数据,终端写入数据没回车,这些数据不会传给read函数,read函数就会一直阻塞;如从网络端读取数据,网络通信的socket文件没有数据,read函数同样会阻塞。

【案例 3】阻塞读,超过字符数会出现什么问题。

#include <unistd.h>
#include <stdlib.h>
int main(void) {char buf[10];//十个字符int n;n = read(STDIN_FILENO, buf, 10);if (n < 0) {perror("read STDIN_FILENO");exit(1);}//of ifwrite(STDOUT_FILENO, buf, n);return 0;
}//of main

问题:为什么会出现命令找不到?
在这里插入图片描述
答:超过10个字符,read只读取了10个字符,剩下的字符保存在内核的终端设备输入缓冲区
a.out退出,Shell进程继续从终端读走剩下的字符d和换行符,把它当成一条命令,结果发现执行不了。

1.3 write函数

#include <unistd.h>
ssize_t write(int fd, void *buf, size_t count);

write函数参数说明: 同read函数
返回值说明: 返回写入的字节数或者-1并设置errno
特殊说明: 向终端或网络端写数据时,可能会进入阻塞状态

1.4 lseek函数

#include <unistd.h>
ssize_t lseek(int fd, off_t offset, int whence);

lseek函数参数说明:

  • fd: 从open或create函数返回的文件描述符
  • offset: 对文件偏移量的设置,参数可正可负
  • whence: 控制设置当前文件偏移量的方法
    – whence = SEEK_SET: 文件偏移量被设置为offset
    – whence = SEEK_CUR: 文件偏移量被设置为当前偏移量+offset
    – whence = SEEK_END: 文件偏移量被设置为文件长度+offset

返回值说明:

  • 设置成功:返回新的偏移量
  • 不成功:-1

1.5 close函数

#include <unistd.h>
int close(int fd);

返回值说明:

  • 成功:返回0
  • 不成功:-1

2 案例

【案例 4】 使用open函数打开或创建一个文件,将文件清空,使用write函数在文件中写入数据,并使用read函数将数据读取并打印。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
int main(){int tempFd = 0;char tempFileName[20] = "test.txt";//Step 1. open the file.tempFd = open(tempFileName, O_RDWR|O_EXCL|O_TRUNC, S_IRWXG);if(tempFd == -1){perror("file open error.\n");exit(-1);}//of if//Step 2. write the data.int tempLen = 0;char tempBuf[100] = {0};scanf("%s", tempBuf);tempLen = strlen(tempBuf);write(tempFd, tempBuf, tempLen);close(tempFd);//Step 3. read the filetempFd = open(tempFileName, O_RDONLY);if(tempFd == -1){perror("file open error.\n");exit(-1);}//of ifoff_t tempFileSize = 0;tempFileSize = lseek(tempFd, 0, SEEK_END);lseek(tempFd, 0, SEEK_SET);while(lseek(tempFd, 0, SEEK_CUR)!= tempFileSize){read(tempFd, tempBuf, 1024);printf("%s\n", tempBuf);}//of whileclose(tempFd);return 0;
}//of main

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

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

相关文章

64位java_树莓派3B+安装64位ubuntu系统和docker工具

想在树莓派3B上安装一些64位应用(例如64位JDK)&#xff0c;因此首先要安装64位的操作系统&#xff0c;今天咱们就一起来实战&#xff1b;

echars显示折点数据_Echarts 折线图一个点显示多个实时数据tooltip

在项目开发需要中。有个需求就是在折线图的每一个折点上悬浮窗要显示几条不同的数据而且是跟x轴一样每个点不一样。。研究了一下。。有点坑。其实很简单&#xff0c;正常的思路来想 要想在悬浮窗显示数据 一般都会有线 才会有实时数据。。这里提一下series&#xff1a;data这个…

主成分分析法_探索主成分分析法

主成分分析法 (Principal Component Analysis, PCA) 是一种数据压缩法&#xff0c;可以从数据中提取重要的部分并排除不重要的部分&#xff0c;是奇异值分解 (Singular Value Decomposition, SVD) 的重要应用。SVD 是线性代数的一个亮点。 是一个 的列阵&#xff0c;矩阵秩 &am…

android 插入耳机 使用自身mic录音_这样选用麦克风,耳机降噪效果会更好

降噪耳机已经越来越普及&#xff0c;降噪耳机要想实现好的降噪效果面临很多挑战&#xff0c;其中如何正确选用麦克风又是一项具有重要影响的基础工作。本文目的旨在帮助读者正确选用麦克风以实现更好的耳机降噪性能&#xff0c;当然也可以帮助您更好地了解降噪耳机原理与实现方…

Linux编程基础 2.2:文件操作

3 文件操作 stat() access() chmod() truncate() link() 3.1 stat函数 #include <sys/stat.h> int stat(const char *path, struct stat *buf);功能&#xff1a;用于获取文件的属性&#xff1b; 参数说明&#xff1a; path&#xff1a;文件路径&#xff1b;buf&#…

心电图 python_ST段凹面型向上抬高,一定是早期复极?心电图读图第201期

病 历 回 顾一名48岁男性患者&#xff0c;有20年吸烟史。打壁球时出现胸骨后闷痛。他被迫中止并休息。其胸痛仍未缓解&#xff0c;同伴把他送至附近急诊室并做了下列心电图。问题&#xff1a;心电图有何显示&#xff1f;可能的诊断是什么&#xff1f;可能受累的冠脉&#xff1f…

封条格式用word怎么打_标书密封条格式全word.doc

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------(投标人公章) (法人名章)密 封 条年 月 日封(法人名章) (投标人公章)-------------------…

Linux编程基础 3.1:进程控制

1 进程相关概念 1.1 进程和程序 程序&#xff1a;编译好的二进制文件&#xff0c;在磁盘上&#xff0c;不占用系统资源&#xff08;cpu、内存、打开的文件、设备、锁…&#xff09;进程&#xff1a;一个抽象的概念&#xff0c;与操作系统原理联系紧密。进程是活跃的程序&…

nlp mrc的损失是什么_田渊栋从数学上证明ICLR最佳论文“彩票假设”,强化学习和NLP也适用...

新智元报道 来源&#xff1a;Facebook AI作者&#xff1a;Ari Morcos、田渊栋 编辑&#xff1a;肖琴【新智元导读】ICLR 2019最佳论文提出的“彩票假设”能够将神经网络缩小10-100倍&#xff0c;而不损失性能。Facebook田渊栋团队的最新研究发现了第一个确定的证据&#xff0…

Linux编程基础 3.2:exec函数族

2 exec函数族 使用fork()函数创建的子进程&#xff0c;其中包含的程序代码完全相同&#xff0c;只能根据fork()函数的返回值&#xff0c;执行不同的代码分支。 由exec函数族中的函数&#xff0c;则可以根据指定的文件名或路径&#xff0c;找到可执行文件。 fork&#xff1a;子…

corel产品注册样机安装代码_为你的产品创建一个高逼格的宣传片

大家好&#xff0c;我是独立开发者Larry&#xff5e;当我们的产品或功能发布的时候&#xff0c;一定想要一套高大上的宣传图或宣传视频&#xff0c;不幸的是&#xff0c;由于预算限制、时间排期以及技术门槛等一系列原因&#xff0c;我们不得不降低要求…今天就给大家推荐一个在…

zabbix监控pppoe线路_Zabbix 完整的监控流程

Zabbix完整的监控流程1.Zabbix的监控历程概念1.1 基本概念zabbix最重要的五个组成部分&#xff1a;Item、Trigger、Action、Media、User(其实应该还有个Event&#xff0c;不过这个表现的不直观)&#xff0c;翻译一下就是监控元素、触发器、动作、报警介质、用户&#xff0c;接下…

Linux编程基础 3.3:进程同步

1 wait函数 #include <sys/wait.h> pid_t wait(int *status);功能&#xff1a;挂起进程&#xff0c;进程进入阻塞状态&#xff0c;直到子进程变为僵尸态&#xff0c;如果捕获到子进程的退出信息就会转为运行态&#xff0c;然后回收子进程资源并返回&#xff1b;若没有变…

单代号网络图计算例题_如何把横道图转化成双代号网络图?

横道图一般都是用Project或者表格做的&#xff0c;下面就用斑马进度计划软件介绍一下怎么将横道图转化为双代号网络图使用工具&#xff1a;广联达斑马进度计划&#xff0c;点击进入官网下载使用Excel表格绘制的横道图&#xff0c;如何快速转化成网络图打开斑马进度计划软件&…

satd残差_RDO、SAD、SATD、λ相关概念【转】

率失真优化概述&#xff1a;率失真优化(Rate D isto r t i on Op t i m ized)策略是在率失真理论[3 ]的基础上提出的一种代价函数方案,  RDO 的主要思想是, 在计算代价函数时, 同时考虑码率和失真度两方面因素的制约, 在保证低失真度的同时保证低码率, 这样更加有利于视频流的…

excel表格不够怎么添加_excel怎么添加筛选

常用的表格处理软件就是excel表格&#xff0c;有时候一些excel上面会有很多不同类型的东西需要筛选以便更能方便寻找&#xff0c;那么excel怎么添加筛选呢&#xff1f;小编跟大家详细介绍。excel怎么添加筛选步骤1&#xff1a;首先&#xff0c;打开一篇你需要选择的Excel步骤2&…

Linux编程基础 4.1:系统调用

1简介 信号&#xff1a;软中断信号&#xff0c;是软件层次上对中断的一种模拟&#xff0c;用于提醒进程事件的发生。 用户比较容易控制的信号发送方式有&#xff1a; 组合按键方式&#xff1b;Shell命令方式&#xff1b;系统调用&#xff1a;kill、raise、abort等。 本部分主…

createsemaphore 异常_浅析SPC之异常分析

未来能源的短缺及资源匮乏&#xff0c;导致各国都在寻求替代能源以避免发生无资源可用的情况。汽油替代能源—生质酒精由此得到了广泛的应用。生质酒精属于生质燃料(Biofuel)的一种&#xff0c;是由生物或化学转换成生物质(biomass)而取得的原料。它能够延长零件的使用寿命&…

Linux编程基础 4.2:软件条件

3 软件条件 当满足某种软件条件时&#xff0c;也可以驱使内核发送信号。 alarm setitimer 3.1 alarm函数 #include <unistd.h> unsigned int alarm(unsigned int seconds);函数功能&#xff1a; 相当于计时器&#xff0c;驱使内核在指定秒数后发送信号到调用该函数的…

layui 如何去dom_常用元素操作 - layui.element

元素功能的开启只需要加载element模块即会自动完成&#xff0c;譬如tab选项卡切换、导航菜单滑动切换效果、面包屑导航、进度条等&#xff0c;使用这些小交互功能的前提就是&#xff1a;拥有符合这些小功能的所需正确的HTML结构&#xff0c;以及加载element模块&#xff1b;如下…