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

经过了漫长的学习,C语言相关的的基础知识算是告一段落了,这也是尝试用写博客的形式来学习c语言,回过头来看,虽说可能写的内容有些比较简单,但是个人感觉是有史起来学习最踏实的一次,因为里面的每个实验都是自己亲自验证过的,我机智不算聪明,所以也没必要去校仿那些“大脑非常聪明”的理解能力很强的“高人”,也许我之前学的那些基础知识在别人来说可能也就一周就完全通了,甚至比你还要理解得透,那我只能“羡慕”,“羡慕”过后,还得去寻找属于自己的学习方法,不管什么形式,只要是最适全自己的就是“好”的,我还是会这种形…
上一节中已经学习了文件描述符的复制,复制方法有三种,其中最后一种fcntl还并未使用到,关于这个函数,不光只有复制文件描述符的功能,还有其它一些用法,本节就对其进行一一剖析: fcntl常用操作: 这里,我们将上节当中用dup或dup2实现复制文件描述符改用fcntl,程序如下: 先将test2.txt的内容清空,以便进行测试,编译运行: 通过man来查看下它的说明: [说明:关于这一的操作命令,等之后学到进程时再来学习,先这边记录一下] 上一节也有介绍过,先回顾一下都有哪些状态标志: 也就是说…
今天继续学习文件与io,主要是学习文件共享及文件.复制文件描述符,有点抽象,主要是概念上的理解,但是很重要,下面一一来分解: 文件共享: 回顾一下,在linux系统调用中,是通过文件描述符来访问文件的,文件描述符是一个非负的整数,这是站在用户的观点来看的,实际上在linux内核上是有一定的数据结构来表示文件描述符的,下面就从三方面来看图分析一下内核中是怎么来表示打开的文件的: 一个进程打开两个文件内核数据结构:   (说明:关于这点,可以看一下我之前的博客:http://www.cnblogs.…
今天继续学习文件与io,话不多说,开始进入正题: 文件的read和write系统调用: 说明:函数中出现在size_t和ssize_t是针对系统定制的数据类型:     下面以一个实现文件简单拷贝的示例(类似于cp命令,但是没cp命令强大),来对其文件的读写有个感性的认识: #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include…
什么是IO? 输入/输出是主存和外部设备之间拷贝数据的过程 设备->内存(输入操作) 内存->设备(输出操作) 高级I/O ANSI C提供的标准I/O库称为高级I/O,通常也称为带缓冲的I/O 低级I/O 通常也称为不带缓冲的I/O 2. 文件描述符:fd 对于Linux而言,所有对设备或文件的操作都是通过文件描述符进行的. 当打开或者创建一个文件的时候,内核向进程返回一个文件描述符(非负整数).后续对文件的操作只需通过该文件描述符,内核记录有关这个打开文件的信息. 一个进程启动时,默认打开…
从系统时钟获取时间方式 time函数介绍: 1.函数名称: localtime 2.函数名称: asctime 3.函数名称: ctime 4.函数名称: difftime 5.函数名称: gmtime 6.函数名称: time 7.函数名称: tzset time.h是C/C++中的日期和时间头文件. 代码示例 # include <stdio.h> #include <time.h> int main(void) { time_t timer =time(NULL); prin…
1. 目录操作相关的系统调用     1.1 mkdir和rmdir系统调用     1.1.1 实例     1.2 chdir, getcwd系统调用     1.2.1 实例     1.3 opendir, closedir, readdir,     1.3.1 实例:递归便利目录 1. 目录操作相关的系统调用 1.1 mkdir和rmdir系统调用 [code] filename: mk_rm_dir.c #include <sys/stat.h> int mkdir(const…
一.lseek()系统调用 功能说明: 通过指定相对于开始位置.当前位置或末尾位置的字节数来重定位 curp,这取决于 lseek() 函数中指定的位置 函数原型: #include <sys/types.h> #include <unistd.h> off_t lseek(int fd, off_t offset, int whence); 参数说明: fd:文件描述符 offset:偏移量,该值可正可负,负值为向前移 whence:搜索的起始位置,有三个选项: (1).SEEK…
上次我们利用文件的read和write来实现了简易的cp命令,其中将源文件拷贝到目标文件时,我们给目标文件的权限是写死的,而非根据源文件的权限生成的,如下: 今天就来解决这个问题,来学习获取文件权限相关的函数,言归正传,正入正题. stat:功能:读取文件元数据   关于stat结构体的结构如下: struct stat { dev_t st_dev; /* ID of device containing file文件保存在磁盘上的设备号,包含主设备号和次设备号,它是16位的整数,高八位为主设备…
本节目标: 1,文件共享 打开文件内核数据结构 一个进程两次打开同一个文件 两个进程打开同一个文件 2,复制文件描述符(dup.dup2.fcntl) 一,文件共享 1,一个进程打开两个文件内核数据结构 说明: 文件描述符表:每个进程都有一张,彼此独立,每个文件描述符表项都指向一个文件表,文件描述符0(STDIN_FILENO).1(STDOUT_FILENO).2(STDERR_FILENO),默认已经打开,分别表示:标准输入,标准输出,标准错误设备. 文件表:每打开一个文件就对应一张文件表,…
本文利用以下系统调用实现ls -l命令的功能: 1,lstat:获得文件状态, 2,getpwuid: #include <pwd.h> struct passwd *getpwuid(uid_t uid); 描述: The getpwuid() function returns a pointer to a structure containing the broken-out fields of the record in the password database  that  matc…
一.stat()获取文件元数据 stat系统调用原型: #include <sys/stat.h> int stat(const char *path, struct stat *buf); int fstat(int fd, struct stat *buf); int lstat(const char *path, struct stat *buf); 帮助信息可通过:man 2 stat 查看 DESCRIPTION        These  functions  return  in…
read系统调用 一旦有了与一个打开文件描述相连的文件描述符,只要该文件是用O_RDONLY或O_RDWR标志打开的,就可以用read()系统调用从该文件中读取字节 函数原型: #include <unistd.h> ssize_t read(int fd, void *buf, size_t count); 参数 fd :想要读的文件的文件描述符 buf : 指向内存块的指针,从文件中读取来的字节放到这个内存块中 count : 从该文件复制到buf中的字节个数 返回值 如果出现错误,返回-…
使用Linux的文件API,经常看见一个东西,叫做文件描述符. 什么是文件描述符? (1)文件描述符其实实质是一个数字,这个数字在一个进程中表示一个特定的含义,当我们open打开一个文件时,操作系统在内存中构建了一些数据结构来表示这个动态文件,然后返回给应用程序一个数字作为文件描述符,这个数字就和我们内存中维护这个动态文件的这些数据结构挂钩绑定上了,以后我们应用程序如果要操作这一个动态文件,只需要用这个文件描述符进行区分. (2)文件描述符就是用来区分一个程序打开的多个文件的. (3)文件描述符…
1.打开文件的函数open,第一个参数表示文件路径名,第二个为打开标记,第三个为文件权限 代码: #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include<stdio.h> int main() { int fd; fd = open(); printf("fd = %d\n",fd); ; } 效果测试:打印打开文件返回的描述符为3,同时创建了文件t…
文件I/O操作在Linux编程时是经常会使用到的一个内容,通常可以把比较大的数据写到一个文件中来进行存储或者与其他进程进行数据传输,这样比写到一个全局数组或指针参数来实现还要方便好多. 一.文件常用操作与相关函数 1.打开或创建一个文件:编写程序时涉及内容——打开或创建文件的路径名称.打开文件的方式(读|写|执行).访问权限(用户|组|其他).实现方式(系统调用|库). ①系统调用方式: #include <fcntl.h> //函数原型声明.flags定义 #include<sys/s…
闲来无事.随便写写,实现简单的ls命令: | 1 #include <stdio.h> | 2 #include <stdlib.h> | 3 #include <dirent.h> | 4 #include <string.h> | 5 | 6 int main(int argc, char **argv) | 7 { | 8 DIR *pDir; | 9 struct dirent *stDir; | 10 int flag = 0; | 11 | 12…
之前,这篇文章:linux系统编程:自己动手写一个cp命令 已经实现过一个版本. 这里再来一个版本,涉及知识点: linux系统编程:open常用参数详解 Linux系统编程:简单文件IO操作 /*================================================================ * Copyright (C) 2018 . All rights reserved. * * 文件名称:cp.c * 创 建 者:ghostwu(吴华) * 创建日期:2…
文件操作(Linux系统编程) 创建一个目录时,系统会自动创建两个目录.和.. C语言实现权限控制函数 #include<stdio.h> #include<stdlib.h> #include<sys/types.h> #include<sys/stat.h> int main(int argc , char **argv){ int mode; int mode_u; int mode_g; int mode_o; char *path; ){ prin…
Linux 系统中的各种输入输出,设计为"一切皆文件".各种各样的IO统一用文件形式访问. 文件类型及基本操作 Linux 系统的大部分系统资源都以文件形式提供给用户读写.这些文件可以分为: 普通文件:即一般意义上的磁盘文件: 设备文件:系统中的具体设备: 管道文件.FIFO 文件:用于进程间通信: 套接字(socket)文件:用于网络通信方面. 文件的通用操作为:打开.关闭.读.写.创建.对应 Linux 系统的 API 接口函数分别为 open().close().read().w…
1.标准C库中访问文件用的是文件指针FILE *(stdin,stdout,stderr):对于linux系统编程而言,所有对设备或文件的操作都是通过文件描述符进行的 2.当打开或者创建一个文件的时候,内核向进程返回一个文件描述符(非负整数),后续对文件的操作只需要通过文件描述符,内核记录有关这个打开文件的信息 3.一个进程启动时,默认打开了3个文件,标准输入.标准输出.标准错误,对应文件描述符是0(STDIN_FILENO).1(STDOUT_FILENO).2(STDERR_FILENO),…
1. 文件系统:用来存储.组织.管理文件的一套方式.协议 2. 文件 文件的属性:i-node唯一表示一个文件的存在与否 文件的内容 3. Linux系统如何实现文件的操作? 点击查看代码 硬件层: inode(属性)--->文件的内容 Linux内核: struct inode{}用来描述一个文件的屋里inode的信息[链表保存],系统识别到一个文件的存在, 就会为它创建一个struct inode,一个文件只会唯一对应一个struct inode struct file{}用来描述一个已经打…
1.大端法与小端法 大端法:按照从最高有效字节到最低有效字节的顺序存储,称为大端法 小端法:按照从最低有效字节到最高有效字节的顺序存储,称为小端法 网际协议使用大端字节序来传送TCP分节中的多字节整数(比如16位端口号,32位IPv4地址). 2.time_wait状态 客户端(执行主动关闭的那一端)连接在收到服务器的结束报文段(FIN, ACK),并没有直接进入CLOSED状态,而是转移到TIME_WAIT状态.在这个状态,客户端连接要等待一段长为2MSL(MSL: 报文段最大生存时间)的时间…
前言 本人再看深入理解Linux内核的时候发现比较难懂,看了Linux系统编程一说后,觉得Linux系统编程还是简单易懂些,并且两本书都是讲Linux比较底层的东西,只不过侧重点不同,本文就以Linux系统编程为例并且会穿插一些深入理解Linux内核的内容来写. 1 入门与基本概念 本书的背景 Linux内核3.9,gcc编译器4.8,C库2.17 文件和文件系统 文件必须打开才能访问 同一个文件可以由多个进程或者同一个进程多次打开.系统会为每个打开的文件实例提供唯一描述符.进程可以共享文件描述…
之前已经花了不少篇幅学习了linux系统编程的很多知识点:文件与io.进程.信号.管道,而零散的知识点,怎么能够综合的串接起来是学习的一个很重要的目的,当然最好的方式就是用所学的知识点做一个项目了,所以接下来会实现一个小型的迷你shell程序,跟缩减版的系统shell程序,不要看着项目很小,但是五脏俱全,先来看一下我们要实现的功能: 如exit会退出程序等. 另外还能捕捉一些信号,如:ctrl+c,也能忽略一些信号,如:ctrl+\,禁止退出自己的程序,这里就不演示了. 下面就来从零开始一步步实…
Linux 网络编程的5种IO模型:多路复用(select/poll/epoll) 背景 我们在上一讲 Linux 网络编程的5种IO模型:阻塞IO与非阻塞IO中,对于其中的 阻塞/非阻塞IO 进行了说明. 这一讲我们来看 多路复用机制. IO复用模型 ( I/O multiplexing ) 所谓I/O多路复用机制,就是说通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作.这种机制的使用需要额外的功能来配合: select.poll.…
Linux 系统编程 学习:01-进程的有关概念 与 创建.回收 背景 上一讲介绍了有关系统编程的概念.这一讲,我们针对 进程 开展学习. 概念 进程的身份证(PID) 每一个进程都有一个唯一的身份证号码,称之为进程号PID(Process Identity Number). 每一个进程都有其双亲进程,称之为父进程(或许称为双亲进程更贴切). 所有的进程都是祖先进程init的后代,除了init进程,每一个进程都有一个父进程. 通过 pstree 命令,可以清楚地看到系统中各个进程间的内在关系.…
Linux 网络编程的5种IO模型:信号驱动IO模型 背景 上一讲 Linux 网络编程的5种IO模型:多路复用(select/poll/epoll) 我们讲解了多路复用等方面的知识,以及有关例程. 这一讲我们来看 信号驱动IO 模型. 介绍 情景引入: 在信号驱动IO模型中,当用户线程发起一个IO请求操作,会给对应的socket注册一个信号函数,然后用户线程会继续执行,当内核数据就绪时会发送一个信号给用户线程,用户线程接收到信号之后,便在信号函数中调用IO读写操作来进行实际的IO请求操作.这个…
Linux 网络编程的5种IO模型:异步IO模型 资料已经整理好,但是还有未竟之业:复习多路复用epoll 阅读例程, 异步IO 函数实现 背景 上一讲< Linux 网络编程的5种IO模型:信号驱动IO模型 >我们已经介绍了信号驱动模型,以及带有BUG的例程. 前面四种IO模型实际上都属于同步IO,只有最后一种是真正的异步IO,因为无论是多路复用IO还是信号驱动模型,IO操作的第2个阶段都会引起用户线程阻塞,也就是内核进行数据拷贝的过程都会让用户线程阻塞. 这一讲我们来介绍最后一种IO模型.…
学到的知识点 通过实现who命令,学到了: 1.使用man命令寻找相关信息 2.基于文件编程 3.体会到c库函数与系统调用的不同 4.加深对缓冲技术的理解 who命令的作用 who命令的使用 在控制终端输入: man who 结果如下图所示 可以看出,who命令的使用很简单,直接在终端输入: who 作用就是显示当前登录的用户信息. who命令的显示结果含义 第一列表示已登录用户,第二列表示终端名,第三列表示登录时间,第四列表示用户的登录地址. 如何实现who命令 逆向推导 定位文件 who命令…