Linux 系统编程
- 简介和主要概念
- Linux 系统编程最突出的特点是要求系统程序员对它们工作的的系统的硬件和操作系统有深入和全面的了解,当然它们还有库和系统调用上的区别。
- 系统编程分为:驱动编程、用户空间编程和网络编程。
- 系统编程有三大基石:系统调用、C库和C编译器。
- 文件I/O
- 文件I/O是Unix系统的核心,第三章会介绍基于C标准库的标准I/O,第四章继续讨论了更高级和专门化的I/O, 第七章以文件盒目录操作为主题结束了整个文件I/O部分的讨论。
- 文件I/O包括 open, creat, read, write, close fsync(同步I/O), fdatasync(同步I/O),sync(同步I/O), lseek, truncate 函数。
- Linux 提供了三种 I/O 多路复用的方法,select , poll , epoll。这三种方式有各自的优缺点,具体参考:
- 缓冲输入输出
- 要理解缓冲,首先要理解块,作为文件系统的抽象,它是 I/O 中最基本的概念,所有的磁盘操作都是基于块进行的。因此当请求以块大小整数倍对齐地址时, I/O 效率是最理想的。
- 标准 I/O 例程并不直接操作文件描述符,取而代之的是文件指针(file pointer)。在C标准库里,文件指针映射到文件描述符。
- 在标准 I/O 里,一个打开的文件叫做“流”(stream)。
- 标准 I/O 包括 fopen, fdopen, fclose, fclose, fgetc, ungetc, fgets, fread, fputc, fputs, fwrites, fseek, ftell, ferror, fileno, setvbuf 等等。
- 标准 I/O 最大的缺点是双副本对性能造成的影响。当读取数据时,标准 I/O 对内核执行read()系统调用,从内核复制数据到标准 I/O 缓冲区。然后当通过标准 I/O 执行一个读请求时,数据又会从标准 I/O 的缓冲区复制到指定的缓冲区。
- read/write和fread/fwrite区别
- fread是带缓冲的,read不带缓冲.
- fopen是标准c里定义的,open是POSIX中定义的.
- fread可以读一个结构.read在linux/unix中读二进制与普通文件没有区别.
- fopen不能指定要创建文件的权限.open可以指定权限.
- fopen返回指针,open返回文件描述符(整数).
- linux/unix中任何设备都是文件,都可以用open,read.
- 如果文件的大小是8k。你如果用read/write,且只分配了2k的缓存,则要将此文件读出需要做4次系统调用来实际从磁盘上读出。如果你用fread/fwrite,则系统自动分配缓存,则读出此文件只要一次系统调用从磁盘上读出。也就是用read/write要读4次磁盘,而用fread/fwrite则只要读1次磁盘。效率比read/write要高4倍。如果程序对内存有限制,则用read/write比较好。都用fread 和fwrite,它自动分配缓存,速度会很快,比自己来做要简单。如果要处理一些特殊的描述符,用read 和write,如套接口,管道之类的系统调用write的效率取决于你buf的大小和你要写入的总数量,如果buf太小,你进入内核空间的次数大增,效率就低下。而fwrite会替你做缓存,减少了实际出现的系统调用,所以效率比较高。
- 如果只调用一次(可能吗?),这俩差不多,严格来说write要快一点点(因为实际上fwrite最后还是用了write做真正的写入文件系统工作),但是这其中的差别无所谓。
- 高级文件I/O
- 主要分为
- 散步/聚集I/O 允许在单次调用中对多个缓冲区做读取和写入操作。 readv 和 writev
- epoll
- 内存映射I/O 将文件映射到内存, mmap, munmap, mremap
- 文件I/O提示 posux_fadvise() 和 readahead()
- 异步I/O
- 进程管理
- 进程是操作系统的基础,是程序的一次执行。是程序及其数据在处理机上顺序执行时所发生的活动。
- 有两种方式创建新的进程:
- fork 调用会导致创建一个子进程
- exec调用则会用新的程序代替当前进程的上下文
- 终止进程有以下几种方式:
- exit
- SIGTERM 和 SIGKILL
- 子进程退出后,转变为僵尸进程,父进程调用 wait 和 waitpid 使得子进程完全退出
- 许多Unix系统在他们的C函数库中提供了 daemon() 函数来完成 守护进程的创建工作。
- 高级进程管理
- Linux 调度算法采用抢占多任务机制,支持多处理器,处理器亲和度,非一致内存访问,实时进程和用户自定义优先级等特性
- 进程优先级 gerpriority() 和setpriority()
- 更多的进程管理参考:
- 7. 文件与目录管理
- 8. 内存管理
- 内存管理包括: 存储器分配(allocation),内存操控(manipulation)和最后的内存释放(release)
- 进程地址空间
- 内存的基本单位是页,32位系统是4K,64位系统是8K
- 每个进程所包含的存储器区域为:
- 代码段(文本段)
- 栈空间
- 堆空间(数据段)
- BBS段 --包含了没有被初始化的全局变量
- 动态内存分配
- malloc , calloc , realloc
- 动态内存释放
- free
- 内存对齐
- 一个结构的对齐要求和它的成员中最大的那个类型是一样的
- 结构体也需要内存对齐
- union的对齐和它所包含的最大的类型一致
- 一个数组的对齐和数组中的元素类型一致
- 匿名存储映射
- 优点:
- 无需关心碎片
- 大小可调整
- 每个分配存在于独立的内存映射,没有必要再求管理一个全局的堆
- 缺点:
- 存储器映射都是页面大小的倍数,容易浪费空间
- 创建一个新的内存映射比从对中返回内存的负载要大
- malloc()使用数据段满足小的分配,匿名存储映射用来满足较大的分配
- 高级存储器分配
- mallopt() 设置存储器管理相关的参数
- malloc_usable_size()和 malloc_trim() 进行调优
- 使用 MALLOC_CHECK 环境变量来开启存储系统额外的调试
- MALLOC_CHECK_=1 ./rudder
- 使用 mallinfo() 来获得关于动态存储分配的统计数据
9. 信号
- 信号是提供处理异步事件机制的软件中断。
- 内核处理信号的三种方式:
- 忽略信号 SIGKILL 和 SIGSTOP 不可以被忽略
- 捕获并处理信号
- 执行默认操作,通常是终止程序
- 映射信号编号为字符串
- extern const char * const sys_siglist[];
- printf("caught %s\n", sys_siglist[signo]);
- 发送信号
- kill()
- 高级信号管理
- sigaction()
Linux 系统编程的更多相关文章
- Linux系统编程温故知新系列 --- 01
1.大端法与小端法 大端法:按照从最高有效字节到最低有效字节的顺序存储,称为大端法 小端法:按照从最低有效字节到最高有效字节的顺序存储,称为小端法 网际协议使用大端字节序来传送TCP分节中的多字节整数 ...
- linux系统编程之错误处理
在linux系统编程中,当系统调用出现错误时,有一个整型变量会被设置,这个整型变量就是errno,这个变量的定义在/usr/include/errno.h文件中 #ifndef _ERRNO_H /* ...
- LINUX系统编程 由REDIS的持久化机制联想到的子进程退出的相关问题
19:22:01 2014-08-27 引言: 以前对wait waitpid 以及exit这几个函数只是大致上了解,但是看REDIS的AOF和RDB 2种持久化时 均要处理子进程运行完成退出和父进程 ...
- Linux系统编程-setitimer函数
功能:linux系统编程中,setitimer是一个经常被使用的函数,可用来实现延时和定时的功能. 头文件:sys/time.h 函数原型: int setitimer(int which, cons ...
- Linux系统编程@进程通信(一)
进程间通信概述 需要进程通信的原因: 数据传输 资源共享 通知事件 进程控制 Linux进程间通信(IPC)发展由来 Unix进程间通信 基于System V进程间通信(System V:UNIX系统 ...
- Linux C 程序 文件操作(Linux系统编程)(14)
文件操作(Linux系统编程) 创建一个目录时,系统会自动创建两个目录.和.. C语言实现权限控制函数 #include<stdio.h> #include<stdlib.h> ...
- 读书笔记之Linux系统编程与深入理解Linux内核
前言 本人再看深入理解Linux内核的时候发现比较难懂,看了Linux系统编程一说后,觉得Linux系统编程还是简单易懂些,并且两本书都是讲Linux比较底层的东西,只不过侧重点不同,本文就以Linu ...
- Linux系统编程【转】
转自:https://blog.csdn.net/majiakun1/article/details/8558308 一.Linux系统编程概论 1.1 系统编程基石 syscall: libc:标准 ...
- linux系统编程:cp的另外一种实现方式
之前,这篇文章:linux系统编程:自己动手写一个cp命令 已经实现过一个版本. 这里再来一个版本,涉及知识点: linux系统编程:open常用参数详解 Linux系统编程:简单文件IO操作 /*= ...
随机推荐
- 转: 在.NET中操作数字证书
作者:玄魂出处:博客2010-06-23 12:05 http://winsystem.ctocio.com.cn/19/9492019.shtml .NET为我们提供了操作数字证书的两个主要的类,分 ...
- 2014多校第一场 I 题 || HDU 4869 Turn the pokers(费马小定理+快速幂模)
题目链接 题意 : m张牌,可以翻n次,每次翻xi张牌,问最后能得到多少种形态. 思路 :0定义为反面,1定义为正面,(一开始都是反), 对于每次翻牌操作,我们定义两个边界lb,rb,代表每次中1最少 ...
- Selenium--cssselector
CSS(即层叠样式表Cascading Stylesheet) Selector来定位(locate)页面上的元素(Elements).Selenium官网的Document里极力推荐使用CS ...
- 【转】Java读取文件方法大全
本文转自:http://www.cnblogs.com/lovebread/archive/2009/11/23/1609122.html#undefined 目录: 按字节读取文件内容 按字符读取文 ...
- 解决virtualbox 虚拟机不能ping通win7
凭经验猜测是由于防火墙引起的,关闭防火墙再ping,果然可行.google说这是由于“win7 防火墙默认的禁ping策略”引起的.但是关闭防火墙很不安全,可以按照以下步骤为防火墙添加入站规则来解决问 ...
- eclipse导入maven web 项目 但是不显示成web 项目
http://blog.csdn.net/jun55xiu/article/details/9028403 1:导入Maven webapp项目(以extdirectspring-demo为例): i ...
- lintcode :Remove Duplicates from Sorted Array 删除排序数组中的重复数字
题目: 删除排序数组中的重复数字 给定一个排序数组,在原数组中删除重复出现的数字,使得每个元素只出现一次,并且返回新的数组的长度. 不要使用额外的数组空间,必须在原地没有额外空间的条件下完成. 样例 ...
- [hackerrank]Even Odd Query
https://www.hackerrank.com/contests/w5/challenges 简单题,注意整数的0次方是1,奇数. #include <iostream> #incl ...
- 机器学习 —— log-linear 模型
昨天刚刚解决了 logistic regression 之后今天又来了个有趣的家伙. logistic regression 很强大,但是也有它的弱点.它最大的弱点就是只能告诉你是或者不是,而无法告诉 ...
- CMake with Win&MinGW
今天一个下午都在做一件简直耻辱play的事情,论文没看,程序没写,玩了一个下午的编译器...心塞(逃... 言归正传,今天要讲在windows下,使用Cmake和MInGW. 1.g++ MinGW的 ...