unix环境高级编程
Mr_慕白
此用户不懒
展开
-
进程管理
进程是UNIX系统中仅次于文件的基本抽象概念。当代目标代码执行时,正在运行的不仅仅是汇编代码,而是由数据、资源、状态和虚拟的计算机组成。一、程序、进程和线程程序(program)是指编译过的、可执行的二进制代码,保存在存储介质,如磁盘上。规模很大的二进制程序集可以称为应用。/bin/ls和/usr/bin/X11都属于二进制程序。进程(process)是指正在运行的程序,是分配资源的基本单位...原创 2020-05-08 14:46:15 · 184 阅读 · 0 评论 -
信号
引言信号是一种软件中断,它提供了异步事件的处理机制。这些异步事件可以来自系统外部(比如,终端用户输入了 ctrl+c 来中断程序,会通过信号机制停止一个程序),也可以来自系统内部(进程包含除以0的误操作)。信号作为一种进程间通信的基本形式,而一个进程可以给另一个进程发送信号。事件的发生是异步的,而程序对信号的处理也是异步的。信号在内核注册,收到信号时,内核从程序的其他部分异步调用信号处理函数...原创 2020-04-15 10:44:35 · 898 阅读 · 0 评论 -
零拷贝技术
本文探讨Linux中主要的几种零拷贝技术以及零拷贝技术适用的场景。为了迅速建立起零拷贝的概念,我们拿一个常用的场景进行引入:一、引文在写一个服务端程序时(Web Server或者文件服务器),文件下载是一个基本功能。这时候服务端的任务是:将服务端主机磁盘中的文件不做修改地从已连接的socket发出去,我们通常用下面的代码完成:while((n = read(diskfd, buf, BU...转载 2020-04-03 16:22:16 · 166 阅读 · 0 评论 -
高级I/O函数二
二、用于读写数据的函数readv/writev,sendfile,mmap/munmap,splice,tee2.1、readv和writevv函数readv和writev函数用于在一次函数调用中读、写多个非连续缓冲区。有时也将这两个函数称为散布读(scatter read)和聚集写(gather write)。#include <sys/uio.h>ssize_t read...原创 2020-04-03 14:54:53 · 216 阅读 · 0 评论 -
高级I/O函数一(pipe/dup/dup2)
引言Linux提供了很多高级I/O函数,并不像基础I/O(read,open)那么常用,但是在特定情况下可以表现出更好的性能。在此讨论和网络编程相关的几个,这些函数大致可以分为三类:用于创建文件描述符:pipe,dup/dup2等用于读写数据的函数:readv/writev,sendfile,mmap/munmap,splice,tee用于I/O行为和属性 :fcntl一、创建文件...原创 2020-04-03 10:57:00 · 602 阅读 · 0 评论 -
I/O多路复用三种方式比较
select模型三个功能:监控添加描述符移除描述符通过对大量事件集合中的描述符阻塞进行各自的事件监控;当对应集合中有描述符事件就绪/超时则返回事件就绪,描述符当前可读/可写/异常;返回之前将集合中没有就绪的描述符全部删除;int select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, stru...原创 2020-04-02 20:13:32 · 733 阅读 · 0 评论 -
高级I/O
一、五种IO模型:阻塞IO;非阻塞IO;信号驱动IO;异步IO;多路转接IOIO操作分为两个过程:等待/数据拷贝1.1、阻塞IO:发起IO调用后,若不具备IO条件,则等待IO条件具备,拷贝数据后返回;1.2、非阻塞IO:发起IO调用后,若不具备IO条件,则立即报错返回,若具备IO条件则立即拷贝数据后返回;1.3、信号驱动IO:先定义IO信号处理,若IO条件具备则直接信号...原创 2020-04-02 19:14:37 · 135 阅读 · 0 评论 -
读取动态链接库(编译时不需要库)
一、引言dlopen()是一个强大的库函数。该函数将打开一个新库,并把它装入内存。该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的。比如 Apache Web 服务器利用某个函数在运行过程中加载模块,这为它提供了额外的能力。一个配置文件控制了加载模块的过程。这种机制使得在系统中添加或者删除一个模块时,都不需要重新编译了。二、函数2.1、dlopen()可以在自己的程序中使用 ...原创 2020-04-02 16:08:23 · 1278 阅读 · 0 评论 -
Linux动态库的编译与使用(两种方式:链接进可执行程序、动态加载)
第一步:编写Linux程序库文件1.动态库接口文件//动态库接口文件getmaxlen.h#ifndef _GETMAXLEN_H_#define _GETMAXLEN_H_int getMaxLen(int *sel,int N);#endif文件2.动态库程序实现文件//动态库程序实现文件getmaxlen.c#include "getmaxlen.h"int...原创 2020-04-02 16:08:02 · 3849 阅读 · 2 评论 -
读取二进制文件
#define BIN_FILENAME "release.bin" //bin文件FILE *pf_bin = NULL;do{ //以只读方式(r)读取二进制文件(b) pf_bin = fopen(BIN_FILENAME, "rb"); if (NULL == pf_bin) { printf("Failed to open file!"); break; }...原创 2020-04-02 14:36:48 · 444 阅读 · 1 评论 -
文件IO与标准IO
一、引言块(block)是文件系统中最小存储单元的抽象。在内核中所有的文件系统操作都是基于块来执行的。所有的IO操作都是在其块大小以及其整数倍上进行的。内核和硬件之间的交互单元是块。其大小一般是512字节,1024子节点,2048字节或4096字节。额外的系统调用所带来的开销会导致操作性能极具下降,假设要读取1024个字节,如果每读取一个字节,需执行调用1024次,而如果一个读取1024字节...原创 2020-04-02 13:40:45 · 1212 阅读 · 0 评论 -
IO多路复用
一、前言当我们要编写一个echo服务器程序的时候,需要对用户从标准输入键入的交互命令做出响应。在这种情况下,服务器必须响应两个相互独立的I/O事件:(1) 网络客户端发起网络连接请求(2) 用户在键盘上键入命令行我们先等待哪个事件呢?没有哪个选择是理想的。如果在acceptor中等待一个连接请求,我们就不能响应输入的命令;类似地,如果在read中等待一个输入命令,我们就不能响应任何连接...转载 2020-03-19 20:53:42 · 376 阅读 · 0 评论 -
FIFO
一、概念管道作为进程间通信的最古老方式,它的缺点是没有名字,因此管道仅仅能用在有亲缘关系的父子进程之间。对于无亲缘关系的进程间。无法用管道进行通信。FIFO能够完成无亲缘关系的进程间的通信。FIFO也被称为命名管道。它是一种特殊类型的文件。在文件系统中以文件名称的形式存在,但它的行为却和上面提到的管道类似。二、创建FIFO创建命名管道有两种方法:1、在命令行上运行命令:mkfifo f...原创 2020-01-19 20:00:50 · 251 阅读 · 0 评论 -
管道
概念管道是UNIX系统IPC的最古老形式,并且所有的UNIX系统都提供此种通信机制。管道有下列两种局限性:历史上,它们是半双工的,现在某些系统提供全双工管道,但是为了最佳的可移植性,我们决不应预先假定系统使用此特性。它们只能在具有公共祖先的进程之间使用。通常一个管道由一个进程创建,然后该进程调用fork,此后父子进程之间可以使用该管道。注:FIFO没有第二种局限性,UNIX域套...原创 2020-01-11 14:28:08 · 172 阅读 · 0 评论 -
函数system
system函数简介system函数能够执行函数参数中的命令。函数的定义如下:#include <stdlib.h>int system(const char* cmdstring);当cmdstring为空指针,如果shell可用则返回非0值,否则返回0。因为system函数在其实现中调用了fork,exec和waitpid,因此有三种返回值:(1) 如果fork失败或...原创 2020-01-09 20:07:45 · 77 阅读 · 0 评论 -
函数exec
简介fork函数在创建子进程后,往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程执行的程序完全替换为新程序,而新程序则从其main函数开始执行。因为调用exec并不创建新进程,所以前后的进程ID并未改变。exec只是用一个全新的程序替换了当前进程的正文、数据、堆和栈段。exec函数有7种不同的exec函数可供使用,它们常常被统称为exec函数。这些exec...原创 2020-01-09 19:49:28 · 151 阅读 · 0 评论 -
函数wait和waitpid
进程终止信号当一个进程正常或异常终止时,内核就向其父进程发送SIGCHLD信号,因为子进程终止是个异步事件(这可以在父进程运行的任何时候发生),所以这种信号也是内核向父进程发的异步通知。父进程可以选择忽略该信号,或者提供一个该信号发生时即被调用执行的函数(信号处理函数)。对于这种信号的系统默认动作是忽略它。wait与waitpid区别1、在一个子进程终止前,wait使其调用者阻塞,而wait...原创 2020-01-09 16:47:37 · 180 阅读 · 0 评论 -
Unix进程退出的方式
Unix进程退出的方式进程有5种正常终止以及三种异常终止方式。正常的结束方式:1:从 main 函数返回:执行return从main函数返回等同于调用exit函数。2:调用 exit 函数:调用exit函数,这个函数由ISO C所定义,包括调用调用所有的被atexit注册过的退出处理程序和关闭所有的标准I/O流。因为ISO C不会处理文件描述符、多进程、作业控制,所以在Unix...原创 2020-01-09 16:10:12 · 1220 阅读 · 0 评论 -
fork函数与vfork函数
fork函数介绍一个现有的进程可以调用fork函数创建一个新进程。UNIX或类UNIX中的分叉函数,fork函数将运行着的程序分成2个(几乎)完全一样的进程,每个进程都启动一个从代码的同一位置开始执行的线程。这两个进程中的线程继续执行,就像是两个用户同时启动了该应用程序的两个副本。#inlcude <unistd.h>pid_t fork(void); //返回值:子进程返回0...原创 2020-01-08 17:32:28 · 293 阅读 · 0 评论 -
unix进程标识
进程标识系统给每个进程定义了一个唯一标识该进程的非负整数,称作进程标识符(PID:Process Identifier)。进程ID是可复用的,当一个进程终止后,其进程ID就成为复用的候选者。大多数unix系统实现延时复用算法,使得赋予新建进程的ID不同于最近终止进程所使用的ID。这防止了新进程误认为是使用同一ID的某个已终止的先前进程。ID为0的进程通常为调度进程,常常被称为交换进程。该进程...原创 2020-01-07 19:35:14 · 156 阅读 · 0 评论