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操作 /*= ...
随机推荐
- js正则函数match、exec、test、search、replace、split使用介绍
match() 使用正则表达式模式对字符串执行查找,并将包含查找的结果作为数组返回. stringObj.match(rgExp) stringObj 必选项.对其进行查找的 String 对象或字符 ...
- ios学习笔记block回调的应用(一个简单的例子)
一.什么是Blocks Block是一个C级别的语法以及运行时的一个特性,和标准C中的函数(函数指针)类似,但是其运行需要编译器和运行时支持,从ios4.0开始就很好的支持Block. 二. ...
- **json_encode:让Json更懂中文(JSON_UNESCAPED_UNICODE)
我们知道, 用PHP的json_encode来处理中文的时候, 中文都会被编码, 变成不可读的, 类似”\u***”的格式, 还会在一定程度上增加传输的数据量. 代码如下: <?php echo ...
- JAVASCRIPT中的作用域和原型链,应该算是难点了,要好好多学学,练练
今天初六,要上班啦... JAVASCRIPT,看来是丢不了了.. http://www.dengdeng90.com/wordpress/?p=241 http://www.cnblogs.com/ ...
- HttpWebRequest和HttpWebResponse
原文:http://blog.csdn.net/haitaofeiyang/article/details/18362225 申公前几日和一个客户做系统对接,以前和客户对接一般采用webservice ...
- hdu 4686 Arc of Dream
思路:构造矩阵 a[i]*b[i]=ax*bx*a[i-1]*b[i-1]+ax*by*a[i-1]+ay*bx*b[i-1]+ay*by 代码如下: #include<iostream> ...
- DML、DDL、DCL区别
1.DML:数据操纵语言.执行完需要提交,有回滚. select.insert.update.delete.call explain plan :Oracle RDBMS执行每一条SQL语句,都必须经 ...
- phpcms V9首页 频道页 列表页 推荐位 简单获取文章浏览量和评论统计
phpcms V9首页 频道页 列表页 推荐位 简单获取文章浏览量和评论统计 列表取得数据方法: {pc:content action="lists" catid="$c ...
- VC6.0下string不能用pusk_back,可用+=代替
2013-09-11 21:14:32 在VS下运行正确的代码,拿到VC6.0下,编译出错,提示: error C2039: 'push_back' : is not a member of 'bas ...
- C++ 11 vlearning
1.新增算术类型 longlong,最小不比long小,一般为64位. 2.列表初始化 int units_sold = {0};或者 int units_sold{0};非11标准 ...