Linux编程
文章平均质量分 73
Linux系统编程、Linux网络编程
天山老妖
多年私募基金量化IT工程师从业经验,专注于Linux/C++、Qt、Python、量化IT技术,具有丰富的中频、高频量化交易系统开发和实盘交易运维经验,熟悉CTP、盛立REM、易达YD、Xele期货柜台API,宽睿OES、华鑫Tora、中泰XTP股票柜台API。
QuantFabric开源:https://github.com/QuantFabric
展开
-
Linux网络编程(五)——epoll机制
一、epoll简介epoll是在2.6内核中提出的,是select和poll的增强版本。epoll更加灵活,没有描述符限制,使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中。1、epoll函数#include <sys/epoll.h>int epoll_create(int size);创建一个epoll的句柄,size表示监听的文件描述的数量int epoll_ctl(int epfd, int op, int size, s原创 2022-02-28 00:04:14 · 828 阅读 · 0 评论 -
Linux网络编程(四)——Select机制
一、select工作机制poll和select,都是基于内核函数sys_poll实现的,不同在于在linux中select是从BSD Unix系统继承而来,poll则是从SYSTEM V Unix系统继承而来,因此两种方式相差不大。poll函数没有最大文件描述符数量的限制。poll和 select与一样,大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,开销随着文件描述符数量的增加而线性增大。select需要驱动程序的支持,驱动程序实现fops内的poll函数。select通过每个设备文件原创 2022-02-28 00:03:59 · 2331 阅读 · 0 评论 -
Linux网络编程(三)——UDP编程模型
UDP编程模型:UDP循环服务器模型为:socket(...);bind(...);while(1){recvfrom(...);process(...);sendto(...);}server.c代码:#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/...原创 2022-02-28 00:03:43 · 340 阅读 · 0 评论 -
Linux网络编程(二)——TCP编程模型
一、TCP编程模型TCP编程的一般模型如下图:TCP编程模型分为客户端和服务器端编程,两者编程流程如下:TCP服务器端编程流程:A、创建套接字;B、绑定套接字;C、设置套接字为监听模式,进入被动接受连接状态;D、接受请求,建立连接;E、读写数据;F、终止连接。TCP客户端编程流程:A、创建套接字;B、与远程服务器建立连接;C、读写数据;D、终止连接。二、TCP迭代服务器编程模型TCP循环服务器接受一个客户端的连接,然后处理,完成了.原创 2022-02-28 00:02:59 · 665 阅读 · 0 评论 -
Linux网络编程(一)——Socket网络编程基础
一、Socket简介1、网络中进程间通信本机进程使用进程号区别不同的进程,进程间通信方式有管道、信号、消息队列、共享内存、信号量等。网络中进程间的通信,首先需要识别进程所在主机在网络中的唯一标识,即网络层的IP地址,主机上的进程可以通过传输层的协议与端口号识别。2、Socket原理Socket是应用层与TCP/IP协议族通信的中间软件抽象层,是一种编程接口。Socket屏蔽了不同网络协议的差异,支持面向连接(Transmission Control Protocol - TCPIP)和无连接原创 2022-02-28 00:02:23 · 1722 阅读 · 1 评论 -
Linux进程间通信(十二)——多线程同步
多线程编程中有三种线程同步机制:互斥锁、信号量、条件量。本文将使用生产者消费者问题编程实践三种线程同步方式。生产者、消费者问题:生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。一、互斥锁互斥锁用来保证同一时间内只有一个线程在执行某段代码(临界区原创 2022-02-28 00:01:41 · 506 阅读 · 0 评论 -
Linux进程间通信(十一)——多线程简介
一、线程简介线程有四种:内核线程、轻量级进程、用户线程、加强版用户线程1、内核线程内核线程就是内核的分身,一个分身可以处理一件特定事情。内核线程的使用是廉价的,唯一使用的资源就是内核栈和上下文切换时保存寄存器的空间。支持多线程的内核叫做多线程内核(Multi-Threads kernel )。2、轻量级进程LWP轻量级进程(LWP)是一种由内核支持的用户线程,是基于内核线程的高级抽象,只有先支持内核线程,才能有轻量级进程LWP。每一个进程有一个或多个 LWP,每个LWP由一个内核线程支持原创 2022-02-28 00:01:27 · 463 阅读 · 0 评论 -
Linux进程间通信(十)——信号
一、信号简介信号是在软件层次上对中断机制的一种模拟,是异步的。信号是进程间通信机制中唯一的异步通信机制,信号机制经过POSIX实时扩展后,功能更为强大,除了基本通知功能外,还可以传递附加信息。信号是进程间通信的一种方式,明确地由一个进程发送给另一个进程。一个信号的产生叫生成,接收到一个信号叫捕获。进程对信号的处理可以分为三种方式:A、忽略信号,即对信号不做任何处理,但有两个信号不能忽略:SIGKILL及SIGSTOPB、捕捉信号。定义信号处理函数,当信号发生时, 执行相应的处理函数C、执原创 2022-02-28 00:01:05 · 626 阅读 · 0 评论 -
Linux进程间通信(九)——信号量
一、信号量简介信号量是解决进程之间的同步与互斥的IPC机制,互斥与同步关系存在的根源在于临界资源。临界资源是在同一个时刻只允许有限个(通常只有一个)进程可以访问(读)或修改(写)的资源,临界资源包括:硬件资源(处理器、内存、存储器以及其他外围设备等)和软件资源(共享代码段、共享结构和变量等)。信号量是描述某一种资源是否可用的变量,信号量的值表示当前可用的资源的数量,若信号量的值等于0则意味着目前没有可用的资源。对信号量进行的两个原子操作(PV操作)P操作:等待。如果sv大于0,减小sv。如果原创 2022-02-28 00:00:46 · 2752 阅读 · 0 评论 -
Linux进程间通信(八)——共享内存
一、共享内存共享内存允许两个或更多进程共享给定的内存区,数据不需要在不同进程间进行复制,是最快的进程间通信方式。使用共享内存唯一需要注意的是多个进程之间对给定存储区的同步访问,但共享内存本身没有提供同步机制,通常使用信号量来实现对共享内存访问的同步。共享内存编程流程:创建共享内存、映射共享内存、使用共享内存、撤销映射操作、删除共享内存1、创建共享内存#include <sys/ipc.h>#include <sys/shm.h>int shmge.原创 2022-02-28 00:00:31 · 409 阅读 · 0 评论 -
Linux进程间通信(七)——消息队列
一、消息队列消息队列用于同一台机器上的进程间通信,是一个在系统内核中用来保存消息的队列,在系统内核中是以消息链表的形式出现。消息链表中节点的结构用msg声明。消息队列是一种从一个进程向另一个进程发送数据块的方法。每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构。消息队列可以避免命名管道的同步和阻塞问题,但是每个数据块都有一个最大长度的限制。1、msgget函数#include <sys/types.h>#include <sys/ipc.h&g.原创 2022-02-28 00:00:13 · 565 阅读 · 0 评论 -
Linux进程间通信(六)——管道
一、管道管道是单向的、先进先出的、无结构的、固定大小的字节流。写进程在管道的尾端写入数据,读进程在管道的首端读出数据。数据读出后将从管道中移走,其它读进程都不能再读到这些数据。管道提供了简单的流控制机制。进程试图读空管道时,在有数据写入管道前,进程将一直阻塞;管道已经满时,进程再试图写管道,在其它进程从管道中移走数据之前,写进程将一直阻塞。管道存在于系统内核之中,管道只能用于具有亲缘关系进程间的通信。管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道。向管道中写入数据时,linu原创 2022-02-27 00:20:22 · 321 阅读 · 0 评论 -
Linux进程间通信(五)——进程间通信
一、进程间通信简介Linux的进程通信方式基本上是从Unix平台上的进程通信方式继承而来的。在Unix发展过程中,贝尔实验室和BSD(加州大学伯克利分校的伯克利软件发布中心)是Unix发展的主要贡献者,但两者在进程间通信方面的侧重点有所不同。贝尔实验室对Unix早期的进程间通信方式进行了系统的改进和扩充,形成了 “system V IPC”,通信进程局限在本地计算机内;BSD则跳过了进程通信局限在本地计算机的限制,形成了可以在计算机间进行通信的基于套接口(socket)的进程间通信机制。Linux则继承原创 2022-02-27 00:20:11 · 262 阅读 · 0 评论 -
Linux进程间通信(四)——Linux系统日志
一、syslog简介syslog 是一种工业标准的协议,用来记录设备的日志。Linux日志系统由系统日志监控程序syslogd和内核日志监控程序klogd组成,两个监控程序都是守护程序(daemon),且都注册成了系统服务。syslogd专门记录非内核的其他设备所产生的日志,当系统的控制权由系统交给init的时候,日志信息的记录由syslogd负责记录。Klogd主要负责内核所产生的日志。内核日志记录信息由dmesg /var/log/dmesg查看。常见linux系统的日志文件:/var/lo原创 2022-02-27 00:20:00 · 654 阅读 · 0 评论 -
Linux进程间通信(三)——守护进程
一、守护进程简介1、守护进程简介守护进程(Daemon)是运行在后台、独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件的一种特殊进程。守护进程常常在系统引导装入时启动,在系统关闭时终止。Linux的大多数服务器就是用守护进程实现的。比如Internet服务器inetd,Web服务器httpd等。同时,守护进程完成许多系统任务。比如,作业规划进程crond等。守护进程的创建本身并不复杂,复杂的是各种版本的Unix的实现机制不尽相同,造成不同Unix环境下守护进程的编程规则并不一致。原创 2022-02-27 00:19:46 · 638 阅读 · 0 评论 -
Linux进程间通信(二)——exec族函数
exec函数族的作用是根据指定的文件名找到可执行文件,并用来取代调用进程的内容,即在调用进程内部执行一个可执行文件,可执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件。exec族函数包含如下函数:#include <unistd.h>extern char **environ;int execl(const char *path, const char *arg, ...);int execlp(const char *file, const char *原创 2022-02-27 00:19:35 · 313 阅读 · 0 评论 -
Linux进程间通信(一)——进程
一、进程简介进程是程序的实例化,是运行中的程序。程序在编译时用链接器,运行时用加载器。进程运行在虚拟地址空间,操作系统中每个进程在独立的地址空间中运行,每个进程的而逻辑地址空间均为4GB(32位系统),0-1G位OS,1G-4G为应用。每个进程都有一个在操作系统内唯一的进程号,进程号的获取函数有:#include <sys/types.h>#include <unistd.h>pid_t getpid(void);//返回当前运行进程的进程IDpid_t ge原创 2022-02-27 00:19:24 · 252 阅读 · 0 评论 -
Linux系统编程(六)——系统信息
一、时间Linux系统下常用的时间类型:time_t、structtm、structtimeval、structtimespec。1、time_t类型时间time_t实际是一个长整型。其值表示为从UTC(coordinateduniversaltime)时间1970年1月1日00时00分00秒(也称为Linux系统的Epoch时间)到当前时刻的秒数。由于time_t类型长度的限制,它所表示的时间不能晚于2038年1月19日03时14分07秒(UTC)。#include <t...原创 2022-02-27 00:19:06 · 1375 阅读 · 0 评论 -
Linux系统编程(五)——目录文件函数
Linux中目录也是文件,目录操作函数为标准IO库函数。主要函数如下:#include <sys/types.h>#include <dirent.h>DIR *opendir(const char *name);DIR *fdopendir(int fd);成功返回一个指向目录流的指针,失败返回NULL,并且设置errno全局变量。#include <dirent.h>struct dirent *readdir(DIR *dirp);..原创 2022-02-27 00:18:44 · 328 阅读 · 0 评论 -
Linux系统编程(四)——文件属性
一、文件属性概述Linux 文件的属性主要包括:文件的节点、种类、权限模式、链接数量、所归属的用户和用户组、最近访问或修改的时间等内容。文件属性示例如下:A、多个文件属性查看ls -lih1341714 -rw-r--r-- 1 root root 2.5K May 28 10:24 bit_marco.c1341718 -rw-r--r-- 1 root root 2.1K May 28 09:08 bit_marco.c~1341706 -rw-r--r-- 1 root root原创 2022-02-27 00:18:13 · 264 阅读 · 0 评论 -
Linux系统编程(三)——标准IO库
与文件IO函数相类似,标准IO库中提供的是fopen、fclose、fread、fwrite等面向流对象的IO函数,函数内部实现时本身要调用linux的文件IO这些系统调用。一、标准IO库函数的缓冲机制由于IO设备的访问速度与CPU的速度相差好几个数量级,为了协调IO设备与CPU的速度的不匹配,对于块设备,内核使用了页高速缓存,即数据会先被拷贝到操作系统内核的页缓存区中,然后才会从操作系统内核的缓存区拷贝到应用程序的地址空间。当应用程序尝试读取某块数据的时候,如果这块数据已经存放在页缓存中,..原创 2022-02-27 00:17:57 · 333 阅读 · 0 评论 -
Linux系统编程(二)——文件描述符控制函数fcntl
由于fcntl函数实在过于灵活和复杂,本文将fcntl函数从文件IO中单独列出来,便于详细解读。函数原型如下:#include <unistd.h>#include <fcntl.h>int fcntl(int fd, int cmd, ... /* arg */ );fcntl函数用于控制操作文件描述符fd,对文件描述符的控制操作由cmd控制命令来控制,arg参数为可选参数,是否需要arg参数取决于控制命令cmd。fcntl()的返回值与控制命令有关。如果出错..原创 2022-02-27 00:17:30 · 750 阅读 · 0 评论 -
Linux系统编程(一)——文件IO
一、文件IO概念Linux文件IO操作有两套大类的操作方式:不带缓存的文件IO操作,带缓存的文件IO操作。不带缓存的属于直接调用系统调用(system call)的方式,高效完成文件输入输出。它以文件标识符(整型)作为文件唯一性的判断依据。这种操作不是ASCI标准的,与系统有关,移植有一定的问题。而带缓存的是在不带缓存的基础之上封装了一层,维护了一个输入输出缓冲区,使之能跨OS,成为ASCI标准,称为标准IO库。不带缓存的方式频繁进行用户态和内核态的切换,高效但是需要程序员自己维护;带缓冲的方式因为有了原创 2022-02-27 00:16:55 · 758 阅读 · 0 评论