Linux系统编程
WeinKee
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Linux下I/O复用模型
以下内容引述至《Linux/Unix系统编程手册》整体概览常见的程序使用的I/O模型都是单个进程每次只在一个文件描述符上执行I/O操作,每次I/O系统调用会阻塞直到完成数据传输。对于许多应用来说,传统的阻塞式I/O模型已经足够了,但这不代表所有的应用都能得到满足。如果可能的话,以非阻塞的方式检查文件描述符上是否可进行I/O操作同时检查多个文件描述符,看它们中的任何一个是否可以执行I/O操作满足这些技术需求的方案是:非阻塞式I/O 和 多进程或多线程技术非阻塞式I/O可以让我们周期性地检查原创 2020-06-27 13:35:15 · 428 阅读 · 0 评论 -
Linux socket 高级主题
以下内容引述自《Linux/Unix系统编程手册》流式套接字上的部分读和部分写如果套接字上可用的数据比在read()调用中请求的数据要少,这种情况下,read()直接返回可用的字节数。如果没有足够的缓冲区空间来传输所有请求的字节,并且满足了如下的几条中的其中一条时,可能会出现部分写的现象。在write() 调用中传输了部分请求的字节后被信号处理例程中断;套接字工作在非阻塞模式下(O_NONBLOCK),可能当前只能传输一部分请求的字节;在部分请求的字节已经完成传输后出现了一个异步错误。对于这里原创 2020-06-26 14:12:22 · 301 阅读 · 0 评论 -
Socket: 服务器设计
以下内容引述至《Linux/Unix系统编程手册》迭代型和并发型服务器对于使用Socket的网络服务器程序,有两种常见的设计形式:迭代型:服务器每次只处理一个客户端,只有当完全处理完一个客户端的请求后采取处理下一个客户端;并发型:这种类型的服务器被设计为能够同时处理多个客户端的请求迭代性服务器通常只使用与能够快速处理客户端请求的场景,因为每个客户端都必须先等待,知道前面所有的客户端都处理完了服务器才能继续服务下一个客户端。迭代型服务器的典型应用场景是当客户端和服务器之间交换单个请求和响应时。原创 2020-06-21 09:23:16 · 500 阅读 · 0 评论 -
Linux Socket Internet Domain
一下内容引述直《Linux/Unix系统编程手册》Internet Domain SocketInternet Domain流socket是基于TCP之上的,他们提供了可靠的双向字节流通信信道。原创 2020-06-19 09:19:52 · 327 阅读 · 0 评论 -
Linux网络socket: TCP/IP网络基础
以下内容引述至《Linux/Unix系统编程手册》互联网协议和层联网协议通常会被组织成一系列的层,其中每一层都构建与下层之上并提供特性以供上层使用。ARP:地址解析协议关注的是如何将因特网地址映射到硬件地址ICMP:用来在网络中传输错误和控制信息(ping和traceroute程序使用),主机和路由器使用因特网组管理协议来支持IP数据报的多播封装封装是分层联网协议中的一个重要的原则。封装中的概念是低层会将从高层向低层传递的信息当成不透明的数据来处理。换言之,低层不会尝试对高层发送过来的信息进行解原创 2020-06-11 09:15:10 · 283 阅读 · 0 评论 -
Linux Socket Unix Domain介绍
以下内容引述至《Linux/Unix系统编程手册》Unix domain socket允许同一系统上不同进程之间相互通信的一种方式Unix domain socket地址在Unix domain中,socket地址以路径名来表示,domain特定的socket地址结构的定义如下所示:struct socketaddr_un { sa_family_t sum_family; char sun_path[108];}sockaddr_un 结构中字段 sun_前缀是根据socket unix原创 2020-06-10 21:41:49 · 965 阅读 · 0 评论 -
Linux下socket入门介绍
以下内容引述至《Linux/Unix系统编程手册》概述应用程序使用socket进行通信的方式如下各个应用程序创建一个socket,socket是一个允许通信的“设备”,两个应用程序都需要用到它;服务器将自己的socket绑定到一个总所周知的地址上使得客户端能够定位到它的位置使用socket系统调用能够创建一个socket,它返回一个用来在后续系统调用中引用该socket的文件描述符fd = socket(domain, type, protocol);通信domainsocket存在于原创 2020-06-10 00:11:25 · 284 阅读 · 0 评论 -
Linux静态库与动态库简介
以下内容引述至《Linux/Unix系统编程手册》静态库静态库被称为归档文件,它是Unix系统提供的第一种库。静态库能带来以下好处:可以将一组经常被用到的目标文件组织进单个库文件,这样就可以使用它来构建多个可执行程序并且在构建各个应用程序的时候无需重新编译原来的源代码文件;链接命令变得更加简单。在链接命令行中只需要指定静态库的名称即可,而无需一个个地列出目标文件了。链接器知道如何搜索静态库并将可执行程序需要的对象抽取出来从结果上看,静态库实际上就是一个保存所有被添加到其中的目标文件的副本的文件原创 2020-05-31 11:49:35 · 337 阅读 · 0 评论 -
Linux进程间通信初入
以下内容引述至《Linux/Unix系统编程手册》IPC工具分类Unix系统上各种通信和同步工具,根据功能可以分为三类:通信: 这些工具关注进程之间的数据交换同步:这些进程关注进程和线程操作之间的同步信号:在特定场景下仍然可以作为一种同步技术数据传输字节流:通过管道、FIFO以及数据报socket交换的数据是一个无分隔符的字节流;每个读取操作可能会从IPC工具中读取任意数量的字节,不管写者写入的块的大小是什么消息:通过System V消息队列、POSIX消息队列以及数据报socket交原创 2020-05-28 09:22:14 · 202 阅读 · 0 评论 -
Linux线程更多细节
以下内容引述至《Linux/Unix系统编程手册》线程栈创建线程时,每个线程都有一个属于自己的线程栈,且大小固定,除主线程外的所有线程,其栈的缺省大小均为2MB,也可以调用pthread_attr_setstack()设置线程属性决定线程站的大小。线程和信号Unix信号模型是基于Unix进程模型而设计的,问世比Pthread要早几十年。所以信号与线程模型之间存在一些明显的冲突。主要是因为一方面,针对单线程进程要保持传统的信号语义,于此同时,又需要开发出使用与多线程进程环境的新信号模型。Unix信号原创 2020-05-27 09:15:15 · 310 阅读 · 0 评论 -
Linux线程安全和线程存储
以下内容引述至《Linux/Unix系统编程手册》可重入性若函数可同时供多个线程安全调用,则称之为线程安全函数;反之,如果函数不是线程安全的,则不能并发调用。实现线程安全有多种方式。其一是将函数与互斥量关联使用,在调用函数时将其锁定,在函数返回时解锁,对函数的访问是串行的;另一种方式是将共享变量与互斥量关联起来。可重入函数无需使用互斥量即可实现线程安全。线程特有数据实现函数线程安全最为有效的方式就是使其可重入。要使用线程特有数据,库函数执行的一般步骤如下:函数创建一个键(key),用以将不原创 2020-05-27 00:07:07 · 227 阅读 · 0 评论 -
Linux线程同步基础
以下内容引述至《Linux/Unix系统编程手册》线程同步方式互斥量 和 条件变量互斥量一般情况下,对每一共享资源(可能由多个先关变量组成)会使用不同的互斥量,每一个线程在访问同一资源时将采用如下协议针对共享资源锁定互斥量访问共享资源对互斥量解锁#include <pthread.h>int pthread_mutex_lock(pthread_mutex *mutex);int pthread_mutex_unlock(pthread_mutex *mutex);in原创 2020-05-26 00:00:13 · 173 阅读 · 0 评论 -
Linux线程初步介绍
以下内容引述至《Linux/Unix系统编程手册》线程Pthread API 定义了一干数据类型数据类型描述pthread_t线程IDpthread_mutex_t互斥对象pthread_mutexattr_t互斥属性对象pthread_cond_t条件变量原创 2020-05-25 23:08:20 · 186 阅读 · 0 评论 -
Linux进程创建&终止&等待&执行
以下内容引述《Linux/Unix系统编程手册》fork、exit、wait、execvefork()系统调用fork允许父进程创建子进程,子进程获取父进程的栈、数据段、堆和执行文本段的拷贝子进程会获得父进程所有的文件描述符的副本。这些副本的创建方式类似于dup(),这也意味着父、子进程中对应的描述符均指向相同的打开文件句柄。内存语义:内核将每一进程的代码段标记为只读,从而使进程无法修改自身代码。系统调用fork为子进程创建代码段时,其所构建的一系列进程级页表项均指向与父进程相同的物理内存页原创 2020-05-22 08:15:58 · 459 阅读 · 0 评论 -
Linux信号处理函数详解
一下内容引述《Linux/Unix系统编程详解》设计信号处理函数信号处理函数设计得越简单越好,这样降低引发竞争条件的风险。两种常见设计信号处理函数设置全局性标志变量并退出,主程序对此标记进行周期性检查,一旦置位随机采取相应动作;信号处理器函数执行某种类型的清理动作,接着终止进程或者使用非本地跳转将栈解开并将控制返回到主程序中的预定位置;可重入函数与异步信号安全函数可重入函数首先区分单线程程序和多线程程序。典型的UNIX程序都具有一条执行线程,贯穿程序始终,CPU围绕单条执行逻辑来处理指令原创 2020-05-15 08:55:16 · 1092 阅读 · 0 评论 -
Unix/Linux系统信号详解-初入信号概念
以下内容引述《Linux/Unix系统编程手册》信号信号是事件发生时对进程的通知机制。有时也成为软件中断。信号与硬件中断的相似之处在于打断了程序执行的正常流程。发往进程的诸多内核,通常都是源于内核。引发内核为进程产生信号的各类事件如下:硬件发生异常,即硬件检测到一个错误条件并通知内核,随即再由内核发送相应信号给相关进程;用户键入了能够产生信号的终端特殊字符;发生了软件事件,比如调整了中断窗口大小,定时器到期,进程执行CPU事件超限等针对每个信号,都定义了一个唯一的整数,从1开始顺序展开原创 2020-05-13 09:36:05 · 400 阅读 · 0 评论 -
Linux内存分配
以下内容引述《Linux/Unix系统编程手册》堆上分配内存进程可以增加堆的大小来分配内存,所谓堆是一段长度可变的连续虚拟内存,始于进程的未初始化数据段末尾,随着内存的分配和释放而增减。通常将堆的当前内存边界称为"program break"调整program break改变堆的大小,就像命令内核改变进程的program break位置一样。最初,program break正好位于未初始化数据段末尾之后。在程序加载program break位置之后,内核会在进程试图访问这些虚拟内存地址时自动分配新原创 2020-05-10 12:51:22 · 302 阅读 · 0 评论 -
Linux进程
以下内容引述《Linux/Unix系统编程手册》进程程序是包含了一系列信息的文件,这些信息描述了如何在运行时创建一个进程二进制格式标志:每个程序文件都包含用于描述可执行文件格式的元信息,内核用此信息来解释文件中的其他信息;机器语言指令:对程序算法进行编码;程序入口地址:标志程序开始执行时的起始指令位置;数据:程序文件包含的变量初始值和程序使用的字面常量值;符号表以及重定位表:描述程...原创 2020-05-08 08:24:39 · 209 阅读 · 0 评论 -
Unix/Linux系统编程概念
以下内容引述<Unix/Linux系统编程手册>系统调用系统调用是受控的内核入口,进程可以请求内核以自己的名义去执行具体动作。系统调用将处理器从用户态切换为核心态,以便CPU访问受保护的内核内存;系统调用的组成是固定的,每个系统调用都是由一个唯一的数字来标志;每个系统调用可辅以一套参数,对用户空间(进程虚拟地址空间)与内核空间之间(相互)传递的信息加以规范系统调用步骤...原创 2020-05-03 00:05:21 · 296 阅读 · 0 评论
分享