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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

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;我们不得不降低要求…今天就给大家推荐一个在…

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

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

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

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

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

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

苹果5越狱教程_unc0ver5.2.0安装方法 iOS13.5用Cydia Impactor或AltStore越狱教程

unc0ver5.2.0是最新更新出来的越狱手机系统&#xff0c;这次的更新不仅仅只是修复了系统的稳定性&#xff0c;大家在更新之后可以支持iOS13.5.5Beta/iOS13.6Beta的使用&#xff0c;所有使用苹果手机的用户想要使用的话可以看下面的详细安装教程&#xff0c;为大家介绍详细的操作…

# 定义四边形_【四边形系列专题】 特殊平行四边形之矩形

点击上方蓝字关注我们【四边形系列专题】特殊平行四边形之矩形TSQ中学数学微信&#xff1a;TSQmaths一、知识网络二、重难突破知识点一 矩形的性质及应用1、定义&#xff1a;有一个角是直角的平行四边形叫做矩形&#xff0e;注意&#xff1a;1、对称性&#xff1a;矩形是轴对称…

xs资料网-产品设计图档下载_proe玩具车3D模型图档下载creo4.0汽车模型下载中磊教育...

现在设计产品的还是有相当一大部分人是用proe造型的&#xff0c;之前我们一直做的是UG的产品造型&#xff0c;今天给大家介绍一款玩具车的3d模型&#xff0c;喜欢的可以下载下载自己研究研究&#xff0c;中磊教育产品设计教程proe玩具车3D模型图档是通过曲面造型所绘制的零件&a…

苹果7手机严重卡顿_分享苹果手机最实用的7个技巧,各个精心挑选,不知道真的太亏了...

使用苹果手机这么久了&#xff0c;你一定也发现了不少好用的功能&#xff0c;今天就来分享苹果手机最实用的7个技巧&#xff0c;每个都是精心挑选&#xff0c;不要错过&#xff0c;总有一个是你需要的。1、 三指操作在编辑文档的时候&#xff0c;三指左滑是撤销(上一步编辑撤销…

如何获取大端中的数据_【软件】ProE中各种获取数据方式的区别

更多精彩&#xff0c;请点击上方蓝字关注我们&#xff01;软件ProE中各种获取数据方式的区别输入特征&#xff1a;输入特征是通过数据共享功能从外部文件输入几何的&#xff0c;文件输入以后&#xff0c;会转换成proe软件能够识别的几何&#xff0c;称为一个特征发布几何&#…

数字类 default 0和 default 0_全方位的数字规划工具Visual Components 4.0 数字化工厂仿真软件...

Visual Components 是全方位的数字规划工具。无论从制程规划、生产到营销都能够整合在同一个平台上作业&#xff0c;有助于内部的技术沟通及外部营销。此外&#xff0c;Visual Components 整合了物流及机器人模拟功能&#xff0c;帮助企业在研发前期即可进行产能确认&#xff0…

会说话的狗狗本电脑版_会说话的电脑有点酷!惠普星14帮你解锁“偷懒”新姿势_惠普 星 14 2020(i5 1135G7/16GB/512GB/MX450)_笔记本新闻...

在现实生活中你是否遇到过这样的情况&#xff0c;笔记本近在咫尺&#xff0c;但你却懒得走到笔记本面前进行操作。当你疲惫地躺在床上时&#xff0c;心里也总是暗想&#xff0c;如果笔记本能够听我的指令跟我对话就好了。工作和生活当中&#xff0c;我们总免不了想要“偷懒”&a…

细粒度图像分类_1.1、 图片分类

记录图像分类论文资源列表。图片分类任务可以分为&#xff1a;粗粒度图片分类、细粒度图片分类。2012 AlexNet &#xff1a;ImageNet Classification with Deep Convolutional Neural Networks。2014 GoogLeNet&#xff1a;Going Deeper with Convolutions。Rethinking the Inc…

AppScan api登录接口 postman_【Postman】12 Postman monitor功能使用

通过前面的文章&#xff0c;我们已经能完成接口的Collection&#xff0c;添加断言&#xff0c;Data文件数据驱动&#xff0c;设置变量&#xff08;Data、Globals和Environment&#xff09;等等方法&#xff0c;对我们的接口进行个各种的测试&#xff0c;保证其正确性。但是还可…

Linux编程基础 5.1:管道

1 简介 Linux进程通信机制&#xff1a; 管道信号量消息队列共享内存socket通信 2 管道 管道其实质是由内核管理的一个缓冲区 形象地认为管道的两端连接着两个进程&#xff1a; 一个进程进行信息输出&#xff0c;将数据写入管道&#xff1b;另一个进程进行信息输入&#xff…