经过了漫长的学习,C语言相关的的基础知识算是告一段落了,这也是尝试用写博客的形式来学习c语言,回过头来看,虽说可能写的内容有些比较简单,但是个人感觉是有史起来学习最踏实的一次,因为里面的每个实验都是自己亲自验证过的,我机智不算聪明,所以也没必要去校仿那些“大脑非常聪明”的理解能力很强的“高人”,也许我之前学的那些基础知识在别人来说可能也就一周就完全通了,甚至比你还要理解得透,那我只能“羡慕”,“羡慕”过后,还得去寻找属于自己的学习方法,不管什么形式,只要是最适全自己的就是“好”的,我还是会这种形式,一步一步去向我的目标迈进的,加油!
头一热,又发表了些许感言,算是给自己沉默的学习上的一种精神上的鼓励吧,今天开始,开始利用已学过的c来学习linux系统编程相关的东东,算是继续对c进行深入吧,言归正传: 
关于什么是linux系统编程,这里就不介绍了,相关的理论可以找相关资料进行查阅,对于程序员来说,只有代码是"最亲切"的,所以正式开始系统编程之前,先学一个东东:
错误处理:
 
下面以具体代码来说明下:
编译运行:
可见perror的出错信息的格式是固定的,不是太灵活,下面再看下更灵活打印错误的方式:
编译运行:
通过这个程序,我们可以看到,用fprintf(关于它的使用,随后会进行详述)可以自定义错误输出格式,会比perror更加灵活。
说明:linux中有很多错误代码,如下:
 
都可以通过strerror来将错误码转换成错误文本,上面程序已经看到了,下面再来试验一下另外一个错误码
 
 
好了,下面正式进入文件与io:
什么是I/0:
对于I/0,我想学过编译的都不会陌生,这里就不多说了,下面简单总结下:
 
而对于linux来说,有两种类型的I/O:
文件描述符【这是新概念,需好好理解】:
我们知道对于ANSI C库来讲,平常操纵文件是FILE文件指针来描述的, 如:
FILE* fp;
 
说明:
 

                           实际上系统调用与ANSI C是一一对应的,只是描述不一样

系统调用:文件描述符,int类型 ANSI C:文件指针,FILE*类型
STDIN_FILENO stdin          
STDOUT_FILENO stdout
STDERR_FILENO  stderror
 
文件描述符与文件指针相互转换:
对于系统调用中的文件描述符与ANSI C标准库中的文件指针可以通过以下函数进行转换:
编译运行:
至于文件描述符转换成文件指针,这时就不演示了,比较简单。
文件系统调用:
open系统调用:
用man查看下:
 
运行:
 
对于其错误输出,还可以perror来输出,篇章开头已经介绍过了,如下:
运行:
 
下面要对代码进行封装了,对于程序出错都需要输出错误信息,并且让程序退出,所以,可以将上面这种错误输出的方式定义为宏,方便其之后调用,如下:
 
运行,看效果:
 
但是,上面的这种宏定义还不够专业,下面这种方式是linux内核中会经常用到的,体现了专业,呵呵:
 
从上面这种打开方式来看,如果文件不存在时,是不会去创建的,那有没有当文件不存时主动去创建呢,其中open的第二个参数就是用来设定打开方式的:
这次编译运行:
关于打开方式,有下列几种:
下面还有另外一种打开文件的函数:
 对于这种打开方式,多了一个权限的参数,下面来看一下具体使用:
编译运行:
这里得对文件的权限进行说明一下,以便于理解这个权限参数:
理解了文件权限相关的知识,回到上面的程序来,我们在创建程序时,给定的文件权限是,也就是rw-rw-rw- ,但是从实际创建的文件来看,它的权限是:
这是为什么呢?这时需要解释一个新概念:umask
查看一下当前系统的umask是多少:
 
0666-0022=0644,就刚好是我们所看到的结果,但是注意,并非是真正意义上的相减运算,如果我们把权限改一下结果就不是这种公式推导出来的结果了:
先来按上面的公式来推算下创建文件的权限:0655-0022=0633,编译运行,见证事实啦:
可见,上面算权限的公式并非只是算术与umask相减,用简单的图来说明下umask的真正意义:
其实对于umask可以在程序中手动更改,我们可以将它设置为0,这样我们指定什么权限,最终文件创建就是什么权限了,如下:
 
编译运行:
目前我们以O_CREATE方式创建的文件,不管我们运行多少次,文件是否已经存在了,也是每次创建成功:
这时,如果想要不重复创建文件,则加上O_EXCL打开方式,再看下运行结果:
运行:
 
关于文件打开失败,有很多信息,这些全可以在open的帮助man里面找到,下面就对其中的某些错误进行一些解释:
一个进程打开文件的最大数怎么查看呢?
一个系统打开文件的最大数又怎么查看呢?
 
另外,对于文件访问权限的指定除了直接输入数字之外,还能利用宏的方式创建,有如下权限组合:
实际上,查看open函数的帮助就有介绍:
下面以这种宏的方式来指定文件权限:
这时来查看下是否成功创建这种权限的文件:
 
close系统调用:
这个比较简单:
creat系统调用【很少用到,可完全被open代替】:
所以说,这个函数很少会用到,直接用open就可以,了解一下。
好了,今天先学到这,下节见!

linux系统编程之文件与io(一)的更多相关文章

  1. linux系统编程之文件与io(五)

    上一节中已经学习了文件描述符的复制,复制方法有三种,其中最后一种fcntl还并未使用到,关于这个函数,不光只有复制文件描述符的功能,还有其它一些用法,本节就对其进行一一剖析: fcntl常用操作: 这 ...

  2. linux系统编程之文件与io(四)

    今天继续学习文件与io,主要是学习文件共享及文件.复制文件描述符,有点抽象,主要是概念上的理解,但是很重要,下面一一来分解: 文件共享: 回顾一下,在linux系统调用中,是通过文件描述符来访问文件的 ...

  3. linux系统编程之文件与io(二)

    今天继续学习文件与io,话不多说,开始进入正题: 文件的read和write系统调用: 说明:函数中出现在size_t和ssize_t是针对系统定制的数据类型:     下面以一个实现文件简单拷贝的示 ...

  4. linux系统编程之文件与IO(一):文件描述符、open,close

    什么是IO? 输入/输出是主存和外部设备之间拷贝数据的过程 设备->内存(输入操作) 内存->设备(输出操作) 高级I/O ANSI C提供的标准I/O库称为高级I/O,通常也称为带缓冲的 ...

  5. linux系统编程之文件与IO(七):时间函数小结

    从系统时钟获取时间方式 time函数介绍: 1.函数名称: localtime 2.函数名称: asctime 3.函数名称: ctime 4.函数名称: difftime 5.函数名称: gmtim ...

  6. linux系统编程之文件与IO(四):目录访问相关系统调用

    1. 目录操作相关的系统调用     1.1 mkdir和rmdir系统调用     1.1.1 实例     1.2 chdir, getcwd系统调用     1.2.1 实例     1.3 o ...

  7. linux系统编程之文件与IO(三):利用lseek()创建空洞文件

    一.lseek()系统调用 功能说明: 通过指定相对于开始位置.当前位置或末尾位置的字节数来重定位 curp,这取决于 lseek() 函数中指定的位置 函数原型: #include <sys/ ...

  8. linux系统编程之文件与io(三)

    上次我们利用文件的read和write来实现了简易的cp命令,其中将源文件拷贝到目标文件时,我们给目标文件的权限是写死的,而非根据源文件的权限生成的,如下: 今天就来解决这个问题,来学习获取文件权限相 ...

  9. linux系统编程之文件与IO(八):文件描述符相关操作-dup,dup2,fcntl

    本节目标: 1,文件共享 打开文件内核数据结构 一个进程两次打开同一个文件 两个进程打开同一个文件 2,复制文件描述符(dup.dup2.fcntl) 一,文件共享 1,一个进程打开两个文件内核数据结 ...

随机推荐

  1. [LeetCode] 459. Repeated Substring Pattern 重复子字符串模式

    Given a non-empty string check if it can be constructed by taking a substring of it and appending mu ...

  2. 【计算机网络基础】URI、URN和URL的区别

    先引用一张关系图 灰色部分为URI URI强调的是给资源标记命名,URL强调的是给资源定位. URI是Uniform Resource Identifier,表示是一个资源: URL是Uniform ...

  3. 怎么查看服务器的cpu和内存的硬件信息

    在linux 下怎么查看服务器的cpu和内存的硬件信息     可以按照如下方式进行操作: 一.查看cpu总个数方法: 1.首先执行top命令,如下图中内容所表示. 2.在top命令的显示界面,按数字 ...

  4. Jenkins+Git+Maven+Tomcat详细安装步骤

    jenkins安装 jenkins的war包安装 以下war包的安装是直接使用war包内嵌的页面访问,也可以将war包放到tomcat的webapps下通过tomcat访问,在下面的tomcat步骤有 ...

  5. ssh远程连接一段时间会失效的问题

    话不多讲,先说明我的环境和远程环境. 本地环境:Ubuntu18.04(client) 远程环境:Ubuntu16.04(server) 我的一个小项目部署在百度云的Ubuntu服务器上,需要经常使用 ...

  6. Oracle数据库常用语法

    基本 --新建表:create table table1( id varchar(300) primary key, name varchar(200) not null); --插入数据 inser ...

  7. C# HtmlAgilityPack爬取静态页面

    最近对爬虫很感兴趣,稍微研究了一下,利用HtmlAgilityPack制作了一个十分简单的爬虫,这个简易爬虫只能获取静态页面的Html HtmlAgilityPack简介 HtmlAgilityPac ...

  8. mysql数据库备份之主从同步配置

    主从同步意义? 主从同步使得数据可以从一个数据库服务器复制到其他服务器上,在复制数据时,一个服务器充当主服务器(master),其余的服务器充当从服务器(slave).因为复制是异步进行的,所以从服务 ...

  9. BUAA_OO第三单元总结性博客作业——JML

    一.JML 在第三单元的面向对象课程中我们第一次接触了JML语言以及基于JML规范的规格化设计.在之前一系列关于面向对象思想的学习认识中,我们知道了Java是一种面向对象的语言,面向对象思想的一个重要 ...

  10. pycharm从本地离线添加模块

    豆瓣的源: http://pypi.douban.com/simple pip install matplotlib -i http://pypi.douban.com/simple --truste ...