![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
服务器编程
文章平均质量分 50
喜欢恋着风
这个作者很懒,什么都没留下…
展开
-
Linux信号处理函数的一些特征
Linux信号是一种异步机制:信号处理函数和程序的主循环是两条不同的执行路线。很显然,信号处理函数需要尽可能快的执行完毕,以确保该信号不会被屏蔽太久(为了避免一些竞态条件,信号在处理期间,系统不会再次触发它),一种典型的解决方法是: 把信号的主要处理逻辑放到程序的主循环中,当信号处理函数被触发时,它只是简单的通知主循环接收到信号,并把信号值传给主循环,主循环再根据接收到的信号值执行目标函数对应的逻原创 2017-07-22 15:27:35 · 712 阅读 · 1 评论 -
管道
管道(pipe)管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系的进程间通信;实现机制管道是由内核管理的一个缓冲区,相当于放入内存的一个纸条。管道的一端连接一个进程的输出,这个进程会向管道中放入信息。管道的另一端连接一个进程的输入,这个进程取出被放入管道的信息。一个缓冲区不需要很大,它被设计成为环形的数据结构,以便管道可以被循环原创 2017-08-18 23:17:44 · 448 阅读 · 0 评论 -
多线程编程
Linux线程概述内核线程和用户线程线程是程序中完成独立任务的完整执行序列。即一个可调度的实体,根据运行环境和调度者身份,线程分为内核线程和用户线程:内核线程:在有的系统上也称为LWP(轻量级进程),运行在内核空间,由内核调度;用户线程:运行在用户空间,由线程库调度;当进程的一个内核线程获得CPU的使用权时,它就加载并运行一个用户线程,可见,内核线程相当于用户线程运行的“容器”。一个进程可以拥原创 2017-08-19 17:35:55 · 263 阅读 · 0 评论 -
多进程编程
fork()系统调用#include<sys/types.h>#include<unistd.h>pid_t fork(void);返回值:在父进程中返回子进程的pid,在子进程中返回零;fork函数复制当前进程,在内核进程表创建一个新的进程表项,新的进程表项有很多属性与原进程相同,比如堆指针、栈指针和标志寄存器的值。但也有许多属性被赋予了新的值,比如该进程的PPID被设置为原进程的PID,信号原创 2017-08-18 21:56:24 · 206 阅读 · 0 评论 -
信号
信号信号是由用户、系统、进程发送给目标进程的信息,以通知目标进程某个状态的改变或系统异常重点内容**,Linux信号可由以下条件产生:对于前台进程,用户可以通过输入特殊终端字符来给它发送信号,比如输入Ctrl + C通常会给进程发送一个中断信号;系统异常,比如浮点异常和非法内存段访问;系统状态变化,比如alarm定时器到期引起SIGALRM信号;运行kill命令或调用kill函数;信号种类原创 2017-08-04 16:01:29 · 229 阅读 · 0 评论 -
网络编程相关函数深层次解析
connect函数解析TCP客户用connect函数来建立与TCP服务器的连接:#include<sys/socket.h>int connect(int sockfd, const struct sockaddr* servaddr, socklen_t addrlen);//成功返回0,失败返回-1并设置errno客户端在调用connect之前不必非得调用bind函数,因为如果需要的话内核会原创 2017-08-06 16:19:44 · 246 阅读 · 0 评论 -
定时器
定时器概述网络程序需要处理的第三类事件是定时事件,比如定期检测一个客户连接的活动状态。服务器程序通常管理着众多定时事件,因此有效的组织这些定时事件,使之能在预期的时间点被触发且不影响服务器的主要逻辑,对于服务器的性能有着至关重要的影响。为此,我们要将每个定时事件分别封装成定时器,并使用某种容器类数据结构,比如链表、排序链表和时间轮,将所有定时器串联起来,以实现对定时事件的统一管理。定时是指在一段时间原创 2017-08-18 11:46:40 · 242 阅读 · 0 评论 -
进程池和线程池
1) 动态创建子进程(子线程)来实现并发服务器有如下缺点:动态创建进程(线程)是比较耗时的,这将导致较慢的客户响应;动态创建子进程(线程)通常是为一个客户服务的(除非我们做特殊的处理),这将导致系统上产生大量的细微进程(线程),进程(线程)间的切换将消耗大量的CPU时间;动态创建的子进程是当前进程的完整映像,当前进程必须谨慎的管理其分配的文件描述符和堆内存等系统资源,否则子进程可能复制这些资源原创 2017-07-27 10:22:54 · 222 阅读 · 0 评论 -
sigaction()之sa_mask
sigset_t sa_mask是一个信号集,在调用该信号捕捉函数之前,将需要block的信号加入这个sa_mask,仅当信号捕捉函数正在执行时,才阻塞sa_mask中的信号,当从信号捕捉函数返回时进程的信号屏蔽字复位为原先值;这个复位动作是sigaction函数内部处理,还是由调用者自己处理呢?由sigaction函数自动复位,不用自己处理。 设置sa_mask的目的在调用信号处理函数时就能阻塞某原创 2017-08-17 23:03:09 · 2732 阅读 · 2 评论 -
I/O复用
I/O复用虽然能同时监听多个fd,但它本身是阻塞的,并且当多个文件描述符同时阻塞时,如果不采取额外的措施,程序就只能顺序依次处理其中每一个fd,这使得服务器程序看起来像是串行工作的。如果要实现并发,只能使用多进程或多线程等编程手段。select系统调用函数原型#include <sys/select.h>int select(int nfds, //指定被监听的文件描述符总数原创 2017-08-17 17:43:52 · 223 阅读 · 0 评论 -
Linux服务器程序规范
Linux服务器程序规范Linux服务器程序一般都是以后台进程形式运行,后台进程又称为守护进程(daemon),其没有控制终端,不会意外接收到用户输入。守护进程的父进程通常是init进程(PID为1的进程);Linux服务器程序通常有一套日志系统,其至少能输出日志到文件,有的高级服务器还能输出日志到专门的UDP服务器;Linux服务器程序一般以某个专门的非root身份运行;Linux服务器程原创 2017-08-08 10:56:50 · 612 阅读 · 0 评论 -
高级I/O函数
应用层程序能往一个TCP连接中写入多少字节的数据,取决于对方的接收窗口的大小和本端的拥塞窗口的大小。管道本身有一个容量限制,规定如果应用程序不将数据从管道读走的话,该管道最多能写入多少字节的数据,自Linux 2.6.11内核起,管道容量的大小是65536字节,可以使用fcntl函数来修改管道容量;管道#include<unistd.h>int pipe(int fd[2]); // 默认情况下是原创 2017-08-06 17:33:23 · 257 阅读 · 0 评论 -
网络编程问题
数据发送假设应用程序要发送40KB数据,但是OS的TCP发送缓冲区只有25KB剩余空间,那么剩下的15KB数据怎么办? 如果等待OS缓冲区可用,会阻塞当前线程,因为不知道对方什么时候收到并读取数据,因此网络库应该把这个15KB数据缓存起来,放到这个TCP链接的应用层发送缓冲区中,等socket变得可写的时候立刻发送数据,这样“发送”操作不会阻塞。如果应用程序随后又发送50KB数据,而此时发送缓冲区中原创 2017-08-17 09:59:49 · 151 阅读 · 0 评论 -
Linux中的五种I/O模型
概念说明用户空间和内核空间现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操作系统将虚拟空间划分为两部分,一部分是内核空间,一部分是用户空间。针对Linux OS而言,将最原创 2017-08-08 16:45:29 · 684 阅读 · 0 评论