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操作 /*= ...
随机推荐
- POJ 4044 Score Sequence
题目链接 题意 :给你两个序列,进行降序排序,找出连续的公共子序列,将这个子序列输出,然后对个位数升序排序,如果个位数相同就按数的大小排,再输出这个新排好的. 思路 :先排序,再找公共子序列,最后个位 ...
- Android 父类super.onDestroy();的有关问题
super.onDestroy(); 的问题. 注意:没有显式地在自己的方法中调用父类Activity的onDestroy是会报错的.我的问题很简单,在我覆盖的onDestroy(),方法中需要调用父 ...
- lintcode:递归打印数字
题目 用递归打印数字 用递归的方法找到从1到最大的N位整数. 样例 给出 N = 1, 返回[1,2,3,4,5,6,7,8,9]. 给出 N = 2, 返回[1,2,3,4,5,6,7,8,9,10 ...
- java:异常处理
异常:编译正常,但运行出错,会中断正常指令流 RuntimeException:运行时异常 分为:uncheck exception.和check exception(除了RuntimeExcepti ...
- idea15 如何设置代码不自动折叠
IDEA默认情况下,如果方法体中只有一行,这个方法体会折叠起来,就像这种
- highcharts 结合phantomjs纯后台生成图片系列二之php2
上篇文章中介绍了phantomjs的使用场景,方法. 本篇文章详细介绍使用php,highcharts 结合phantomjs纯后台生成图片.包含一步步详细的php代码 一.highcharts 结合 ...
- android为应用程序添加退出动画
原本想搞一个退出程序时,把前一个应用程序的VIEW或者截图抓过来为我用,以实现更复杂的动画效果,尝试了很多方法,但都有或多或少的缺陷,可惜最后失败了.不过也算有所得.写文以标记. 其实抓图在4.0以后 ...
- MariaDB10.2.X-新特性2-支持check约束and with as
前几天写了一篇MariaDB10.2支持分析函数,大家印象中MySQL不支持with as ,check约束,那么MariaDB10.2也同样给你惊喜 1.with as MariaDB [test1 ...
- hdu 4864 Task (贪心 技巧)
题目链接 一道很有技巧的贪心题目. 题意:有n个机器,m个任务.每个机器至多能完成一个任务.对于每个机器,有一个最大运行时间xi和等级yi, 对于每个任务,也有一个运行时间xj和等级yj.只有当xi& ...
- (转)博弈问题与SG函数
博弈问题若你想仔细学习博弈论,我强烈推荐加利福尼亚大学的Thomas S. Ferguson教授精心撰写并免费提供的这份教材,它使我受益太多.(如果你的英文水平不足以阅读它,我只能说,恐怕你还没到需要 ...