![](https://img-blog.csdnimg.cn/20190918140129601.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Unix内核编程相关
文章平均质量分 99
APUE
粪逗er
努力的人运气不会差
展开
-
unix内核链表说明与使用案例
#include “list.h”#include <stdio.h>#include <stdlib.h>#include <stdlib.h>typedef struct {int id;struct list_head list;}list_item_t;int main(){list_item_t *node;struct list...原创 2019-10-31 19:26:43 · 251 阅读 · 0 评论 -
**10种大并发服务器设计方案与muduo库网络模型使用
常见并发服务器方案循环式/迭代式服务器:短链接缺点:无法充分利用多核CPU,不适合执行时间较长的服务并发式服务器:长连接(1)主进程负责监听client的连接请求(2)当连接建立后,新fork一个子进程与client通信适应场景:适用于执行时间比较长的服务prefork服务器(1)父进程进行listen,然后先fork出大量的子进程===&amp;amp;amp;amp;amp;amp;amp;gt;此时,父子进程都lis...原创 2018-11-21 20:03:09 · 1014 阅读 · 0 评论 -
*一文详解高性能服务器架构设计
初始情况:一个典型的服务器结构添加数据访问层DAL,解决超出连接次数的问题添加缓存即使添加了DAL,但是数据库每秒允许建立的连接总会有上限,可以从不与数据库建立连接就能访问数据库中的数据着手,来提高访问效率。答案:添加缓存,将数据库经常访问的数据,假如到缓存,可以使得访问数据时不与数据库建立连接,而是直接从缓存中查找。...原创 2018-11-19 22:02:59 · 7628 阅读 · 2 评论 -
libevent核心思想:epoll反应堆模型
一.Linux下的I/O复用与epoll详解与select/poll不同的是,epoll采用回调函数机制,epoll只关心“活跃”的连接,无需遍历全部的文件描述符一.为什么引出epoll?1.select的缺点1.select所用到的FD_SET是有限的/linux/posix_types.h:#define __FD_SETSIZE 10243.select/p...原创 2018-10-30 19:59:43 · 3283 阅读 · 6 评论 -
信号驱动式I/O
针对一个套接字使用信号驱动式IO(SIGIO)要求进程执行以下3个步骤:(1) 建立SIGIO信号捕捉函数(2) 设置套接字的属主,通常使用fcntl的F_SETOWN命令设置(3) 开启该套接字的信号驱动式IO,通常使用fcntl的F_SETFL命令打开O_ASYNC标志对于UDP套接字,SIGIO信号在发生以下事件时产生:① 数据包到达套接字(需要在SIGIO信号捕捉函数中调用rec...原创 2019-06-13 11:39:17 · 948 阅读 · 0 评论 -
线程和信号: pthread_sigmask、sigwait
pthread_sigmask原创 2019-06-12 12:43:27 · 764 阅读 · 0 评论 -
sigsuspend & 等待
int sigsuspend(const sigset_t* sigmask);sigsuspend的原子操作步骤:( 假设当前进程的信号屏蔽字集为 cur_sigmask )使用 sigmask 替换 当前进程信号屏蔽字集cur_sigmask,接着使 进程阻塞当进程收到 除sigmask信号集[之外] 的信号A时,将依次执行以下操作:① 转而执行信号A的信号处理函数,(在信号A的信...原创 2019-06-12 12:04:49 · 202 阅读 · 0 评论 -
信号捕捉函数 & sigaction | 临时信号屏蔽集
sigaction:注册signum信号处理函数,并设置 ”临时信号屏蔽集“。临时信号屏蔽的本质是什么?① 假设信号A在临时信号屏蔽集sa_mask中( 设signum != A )② 当signum信号发生时,将进入注册的信号处理函数③ 在信号处理函数执行过程中,假如此时有信号A产生,那么信号A将被忽略(信号A变成未决状态)④ 当信号处理函数执行完成后,未决的信号A将被递达,信号A的处...原创 2019-06-11 21:31:19 · 742 阅读 · 0 评论 -
信号发送 & sigqueue、sigaction
sigqueue:给指定pid的进程发送信号sig,并且携带数据(数据存放在value参数中)int sigqueue(pid_t pid, int sig, const union sigval value); 用于携带数据union sigval { int sival_int; vo...原创 2019-06-11 21:13:25 · 354 阅读 · 0 评论 -
信号捕捉函数 signal
1.signal函数sighandler_t signal(int signum, sighandler_t handler); 2.sigcation函数int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);struct sigaction { void (*sa...原创 2018-10-16 09:04:52 · 555 阅读 · 0 评论 -
信号集 & sigprocmask、sigpending
(10.信号signal)基础知识:信号处理的工作原理:阻塞信号集/未决信号集未决信号集: 没有被当前进程处理的信号集阻塞信号集: 将某个信号放到阻塞信号集,这个信号就不会被进程处理 阻塞解除后,信号被处理---------------------------------------------------------------信号处理的工作原理:内核PCB中,存放着未决信号集/阻...原创 2018-10-15 17:19:21 · 282 阅读 · 0 评论 -
发信号raise、abort、kill、killpg / 定时器alarm、setitimer
1.kill;raise;abort1.kill--发送信号给指定进程:int kill(pid_t pid, int sig); pid&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;0:发信号给指定的进程 pid=0:调用kill函数的进程的(同一组的所有进程) pid&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;-1:取|pid|发给对应进程组 pid=-1:发送给进程原创 2018-10-15 16:56:20 · 358 阅读 · 0 评论 -
信号概念、可靠信号/不可靠信号
1.信号由[内核]产生发送的2.信号的状态 产生 未决:未处理,等待被进程处理 递达:已经处理3.处理方式 忽略 捕捉 执行了默认的操作:man 7 signal Term 终止 Ign 忽略 Core 终止后,产生core文件,用于调试 Stop 暂停 Cont 继续执行4. 信号 值 动作 说明 ─────...原创 2018-10-15 15:46:45 · 1650 阅读 · 0 评论 -
getaddrinfo
int getaddrinfo( const char* hostname, //主机名 or 地址串(IPv4点分十进制、IPv6十六进制数串) const char* service, //服务名 or 十进制端口号数串 const struct addrinfo* hints, //调用者在这个结构中填入关于[期望返回]的信息类型的暗示 struct ...原创 2019-06-13 13:49:54 · 1476 阅读 · 0 评论 -
gethostbyname、gethostbyaddr
使用 主机名、IPv4地址 得到 struct hostent 结构体(主机的详细信息),先介绍该结构体:struct hostent{ char* h_name; 主机名 char** h_aliases; 别名列表 int h_addrtype; 主机地址类型AF_INET int h_length; 地址长度 char...原创 2019-06-13 13:06:10 · 351 阅读 · 0 评论 -
getservbyname、getservbyport
名字和端口号的映射存放在/etc/services配置文件中,那么之后,尽管端口号发生改变,我们仅仅需要修改/etc/services配置文件中某个服务对应的端口号即可(不需要重新编译程序)。先介绍 struct servent 结构体struct servent{ char* s_name; 服务名 char** s_aliases; 别名列表 int ...原创 2019-06-13 13:02:38 · 665 阅读 · 0 评论 -
pselect
Linux下的I/O复用与select详解:https://blog.csdn.net/weixin_36750623/article/details/83242103Question:有了select,为什么引出pselect?原创 2019-06-12 13:33:21 · 962 阅读 · 0 评论 -
socket[可读\可写\异常]3种条件的发生
一、下列四个条件中的任何一个满足时,socket准备好读:socket接收缓冲区中已经接收的数据的字节数大于等于socket接收缓冲区低潮限度的当前值;对这样的socket的读操作不会阻塞,并返回一个大于0的值(即:准备好读入的数据的字节数)。注解:可以用socket选项SO_RCVLOWAT来设置此低潮限度,对于TCP和UDPsocket,其缺省值为1。socket是一个用于监听的soc...原创 2018-12-10 20:49:35 · 845 阅读 · 0 评论 -
UNIX域套接字
UNIX Domain Socket的特点1.UNIX Domain Socket为什么比TCP/IP在本地上通信更加快因为UNIX Domain Socket不经过网络协议栈 / 不需要打包拆包 / 计算校验和 / 维护序号和应答,只是将应用层数据从一个进程拷贝到另一个进程2.UNIX Domain Socket也提供面向流和面向数据包的两种API接口,类似于TCP和UDP,但是面向消息的...原创 2018-10-31 13:18:08 · 745 阅读 · 0 评论 -
UDP之多播/组播
什么是多播(组播)?为什么出现多播(组播)?由上节课讲到的广播,可以知道:Server给局域网的交换机发送数据,无论连接到局域网的客户端想不想接收该数据,Server都会给客户端发送该数据。—&gt;进而造成客户端上数据的拥塞—&gt;因此引出了多播(组播):Server可以将数据包只发送给指定组内的客户端,而不发送给指定组外的客户端。组播地址IP地址244.0.0.0~...原创 2018-10-31 10:23:55 · 24553 阅读 · 2 评论 -
UDP之广播
一.IP地址简介广播使用的特殊的IP地址:最后一位是255时的IP地址是给广播预留的IP地址,如:192.168.88.255二.广播的实现原理三.广播的Server代码实现1.setsockopt:给socketfd开放广播权限int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t...原创 2018-10-31 10:05:54 · 18107 阅读 · 7 评论 -
UDP之C/S模型以及connect()函数
一.TCP和UDPTCPUDP面向连接的可靠数据包传递无连接的不可靠报文传递数据传输稳定(丢包重传)不稳定速率稳定流量稳定(滑动窗口)传输效率低传输效率高大文件/重要文件传输对实时性要求较高,视频会议/视频电话/广播腾讯QQ使用的是什么协议?发展历史:TCP–&amp;amp;gt;TCP+UDP—&amp;amp;gt;UDP+应用原创 2018-10-31 08:45:26 · 468 阅读 · 0 评论 -
Linux下的I/O复用与epoll详解
为什么引出epoll?1.select的缺点1.select所用到的FD_SET是有限的/linux/posix_types.h:#define __FD_SETSIZE 10243.select/poll都要进行不断的将fd集合在内核空间和用户空间的来回拷贝2.内核中实现 select是用轮询方法,即每次检测都会遍历所有FD_SET中的句柄,显然,select函数执...原创 2018-10-29 15:16:55 · 716 阅读 · 0 评论 -
Linux下的I/O复用与poll详解
1.poll和select(1)不同点poll没有最大文件描述符数量的限制。(2)相同点管理多个描述符也是进行轮询,根据描述符的状态进行处理包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间不论这些文件描述符是否就绪,它的开销随着文件描述符数量的增加而线性增大2.函数API头文件: #include &amp;amp;amp;amp;amp;lt;poll.h&amp;amp;amp;amp;amp;gt;函数原型: int原创 2018-10-29 14:56:39 · 273 阅读 · 0 评论 -
企业财富库:粘包(readn/writen实现自定义包体)+超时检测timeout+多并发C/S模型
1.头文件comsocket.h#ifndef __COMSOCKET_H__#define __COMSOCKET_H__#ifdef __cplusplusextern &amp;amp;quot;C&amp;amp;quot;{#endif#include &amp;amp;amp;lt;sys/types.h&amp;amp;amp;gt; /* See NOTES */原创 2018-10-23 17:39:58 · 220 阅读 · 0 评论 -
企业财富库:select实现[超时]检测:read_timeout;write_timeout;connect_timeout;accept_timeout
1.头文件comsocket.h#ifndef __COMSOCKET_H__#define __COMSOCKET_H__#ifdef __cplusplusextern &amp;amp;amp;amp;amp;amp;quot;C&amp;amp;amp;amp;amp;amp;quot;{#endif#include &amp;amp;amp;amp;amp;amp;amp;lt;sys/types.h&am原创 2018-10-23 15:44:54 · 1045 阅读 · 1 评论 -
Linux下的I/O复用与select详解
int select(int nfds, fd_set *restrict readfds, fd_set *restrict writefds, fd_set *restrict errorfds, struct timeval *restrict timeout ); 成功:返回所有sets种的描述符个数:readfds+writefds+errorfds 超时:返回...原创 2018-10-21 15:48:16 · 400 阅读 · 0 评论 -
shutdown与close (TCP关闭)
终止数据传输的两个方向原创 2018-10-20 22:07:40 · 739 阅读 · 0 评论 -
TCP/IP流协议(处理粘包):readline—包尾\n(recv/send)
recvssize_t recv(int socket, void *buffer, size_t length, int flags);返回值 &amp;amp;amp;amp;amp;amp;amp;amp;amp;gt; 0 成功接收数据大小 = 0 另外一端关闭了套接字 = -1 错误,需要获取错误码errno 1.recv与read相比,只能用于socket流2.多了一个辅助选项 MSG_OOB 带外数据 紧急指针..原创 2018-10-20 14:01:55 · 1217 阅读 · 0 评论 -
TCP/IP流协议(处理粘包):自定义包packet(readn/writen)***
1.TCP/UDP特点 TCP 无边界 字节流 UDP 有边界 消息/数据报 2.TCP读取流式套接字会出现未知的错误: 对方,一次读操作,不能保证完全把消息读完 对方接收数据包的个数是不确定的3.产生粘包问题的原因: 1.SQ_SNDBUF套接字本身有缓冲区(发送缓冲区/接收缓冲区) 2.TCP传送的端MSS大小限制 3.链路层也有MTU大小限制,如果数据包&amp;amp;amp;amp;amp;amp;amp;amp;amp;a原创 2018-10-18 12:27:56 · 931 阅读 · 0 评论 -
p2p点对点通信
原创 2018-10-17 21:04:09 · 630 阅读 · 0 评论 -
并发服务器之fork
程序功能: 支持多个client与server连接并recv和write 每来一个新的client,server都fork一个子进程为client服务(子进程用于与client通信:recv/write)server程序的实现细节: 父进程的while(1)循环中,一直调用accept接收新的连接 当accept接收成功后,返回新的套接字newconn,然后fork子进程与newconn...原创 2018-10-17 16:20:14 · 480 阅读 · 0 评论 -
socket常用API
1.端口在进行通讯的时候,要首先通过IP地址获取主机再通过Port用来区分和主机上的哪个应用程序通信2.IPv4套接口地址结构:网际套接字地质结构 sockaddr_in:man 7 ip1.头文件:netinet/in.h2.sockaddr_in结构struct sockaddr_in { sa_family_t sin_family; /* 地址族: AF_INET */ ...原创 2018-10-17 12:14:15 · 896 阅读 · 1 评论 -
根据PID获取进程名&根据进程名获取PID
通过进程名获得进程号通过进程号获得进程名#include <sys/types.h>#include <dirent.h>#include <stdio.h>#include <string.h> #define BUF_SIZE 1024void getPidByName(pid_t *pid, char *task_name)...原创 2019-08-25 21:06:58 · 4607 阅读 · 0 评论 -
孤儿进程/僵尸进程<defunct> Z+
1、孤儿进程爹生孩子;爹死了,孩子还或者,孩子叫孤儿进程;孤儿进程被init进程领养,init进程变为孤儿进程的父亲int main(){ pid_t pid=fork(); ...原创 2019-06-10 12:49:48 · 567 阅读 · 0 评论 -
守护进程
守护进程1.特点: 后台服务 独立于控制终端 周期性的执行任务 不受用户登陆注销影响 一般采用以d结尾的名字(服务)2.进程组 [1]进程的组长? 组里边的第一个进程 进程组的ID==进程组的组长的ID [2]进程组组长的选择 进程中的第一个进程 [3]进程组ID的设定 进程组的ID就是组长的进程ID3.会话:多个进程组 1.创建一个会话注意事项 不能是...原创 2018-10-16 09:05:50 · 126 阅读 · 0 评论 -
exec函数族:execl/execle/execlp;execv/execve/execvp || system函数
1.exec函数组1.返回值: 如果函数执行成功,不返回 如果函数执行失败,不需要判断返回值:可以直接打印输出,退出程序2.exec函数族的[执行原理] 能够[替换]进程地址空间的[代码段.text]使用场景: 1.执行一个另外的程序不需要创建额外的地址空间 2.一个运行的程序a,想调用另外的应用程序b2.函数介绍int execl(const char *path, co...原创 2018-10-13 20:11:49 · 431 阅读 · 0 评论 -
进程的5种终止方式
ps 查看进程[使用的最多] 已知启动程序的名字,查看该程序的pid: pa aux|grep 程序名ps au #只显示[依赖终端]的进程的信息ps aux #显示[依赖终端]和[不依赖终端]的进程的信息 [不依赖终端],即在TTY为?的也显示出来[gjw@localhost 2-ps_kill]$ ps aux | head -2USER PID %C...原创 2018-10-13 19:00:20 · 2441 阅读 · 1 评论 -
fork/vfork详解
getpid 获取当前进程idgetppid 获取当前进程的父进程的idpid_t fork()1.为什么fork有两个返回值? 因为这两个返回值是由不同的进程return出来的,而不是由一个fork函数返回两个数。(fork后,进程由一个变成两个,两个进程分别有一个返回值)返回值: &amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;0:失败 &amp;amp;amp;amp;amp;amp;amp;amp;原创 2018-10-13 18:38:27 · 3761 阅读 · 1 评论 -
系统调用/API;程序/进程;并行/并发;PCB;进程状态
1.程序和进程程序:二进制文件,占用磁盘空间进程:启动的程序 需要的数据都在内存中 需要占用更多的系统资源:CPU,物理内存2.并行和并发并行:多个CPU,一个CPU对应一个任务并发:时间段分成若干个时间片,交替处理任务3.PCB每个进程在内核中都有一个进程控制块PCB来维护进程相关的信息,Linux内核的PCB是task_struct结构体。/usr/src/linux-...原创 2018-10-13 17:40:05 · 410 阅读 · 0 评论