一、被中断的系统调用(EINTR)的理解 1. 慢系统调用是? 2. 慢系统调用的类别 3. EINTR产生的原因 5. 一般处理方法 二、SIGCHLD信号的处理 1. SIGCHLD信号的产生 2. SIGCHLD信号的处理 3. 不处理SIGCHLD的后果 三、示例代码 一、被中断的系统调用(EINTR)的理解 1. 慢系统调用是? 慢系统调用指可能永远阻塞的系统调用。 也就是处于阻塞状态的系统调用,如果不收到需要的信息,就会一直阻塞在那里。例如accept:在服务器等待客户端建立连接时,如果没有客户端来请求连接,那么accept就会一直阻塞,直到有客户端请求连接为止。像这种系统调用,就称为慢系统调用。 2. 慢系统调用的类别 对管道的读写 对终端设备设备的读写 对网络连接的读写 …… 值得注意的是,读写磁盘文件一般不会阻塞,一般会返回给调用者(在没有硬件故障的条件下) 3. EINTR产生的原因 当阻 继续阅读 >>


王良 18/08/20 15:11:16
终端输入 sudo netease-cloud-music 但是这意味着终端不能关闭, 而且每次都要这样实在是麻烦, 发现是 sudo, 那肯定是权限问题了, 所以只要更改网易云的执行权限就好了 打开 /usr/share/applications 目录, 在下面找到网易云 ( netease-cloud-music.desktop ) 更改其执行权限sudo chmod 777 netease-cloud-music.desktop (每个人都有读和写以及执行的权限) 重启 OK了 作者:weixin_36888577 发表于 2018/08/20 11:28:51 原文链接 https://blog.csdn.net/weixin_36888577/article/details/81868462 继续阅读 >>


吕子健 18/08/20 11:28:51
引入 与很多高校一样,西安皇家邮电大学一直钟爱于正方教务管理系统。 前一段时间爬了学校的旧版的教务系统,旧版主页 想了解更多请点击这里:爬取学校教务系统获取学生信息 不知道学校是不是把装空调的拿去买新教务系统了,新教务系统主页 可以看出,学校用的仍然是正方教务系统,不过版本升级了,新教务系统是用Java写的后台,前端用了Bootstrap框架。与旧系统相比,界面美观大方,易用性也明显提高。 准备 模拟登陆前,我们首先要清楚需要提交那些数据。 打开F12,我们在访问主页时,除了加载了JS的HTML还向服务器发送了一个get请求。 直接访问它可以获取一个json: {"exponent":"AQAB","modulus":"AIMNm8zi5XkWLRDUy7w6bjypS+d8ng7an00UYH8UZMhUvrDAvpuifsFu+rU6dmMFQHpHGo9ZlyEy9GWy6ev3s8ro15869OIKo\/nwexEnb8AD0DO7NaV9jzDjqRj 继续阅读 >>


李猛 18/08/20 10:00:19
引入 前一段时间爬了学校的旧版的教务系统,想了解更多请点击这里:爬取学校教务系统获取学生信息 旧版教务系统主页 不知道学校是不是把装空调的拿去买新教务系统了,新教务系统主页 可以看出,学校用的仍然是正方教务系统,不过这是新的版本。新教务系统是后台是用Java写的,前端用了Bootstrap等,比就系统好看多了,易用性也明显提高。 准备 模拟登陆前,我们首先要清楚需要提交那些数据。 打开F12,我们在访问主页时,除了加载了JS的HTML还向服务器发送了一个get请求。 直接访问它可以获取一个json: {"exponent":"AQAB","modulus":"AIMNm8zi5XkWLRDUy7w6bjypS+d8ng7an00UYH8UZMhUvrDAvpuifsFu+rU6dmMFQHpHGo9ZlyEy9GWy6ev3s8ro15869OIKo\/nwexEnb8AD0DO7NaV9jzDjqRjEldAs5ct9pdjo7SxQccJYfSbFbwb6206w1q4 继续阅读 >>


李猛 18/08/18 17:59:04
  unp上讲述了以下三种方法: 1.调用alarm,它在指定超时期满时将产生SIGALRM信号。 2. 使用select为函数设置超时 3.使用SO_RCVTIMEO套接字选项为函数设置超时 (1.1).使用 SIGALRM 信号为 connect设置超时 static void connect_alarm(int); int connect_timeo(int sockfd, const SA *saptr, socklen_t salen, int nsec) { Sigfunc *sigfunc; int n; sigfunc = Signal(SIGALRM, connect_alarm);//设置新的信号处理函数 if (alarm(nsec) != 0)//检测以前有没有设置过时钟,如果有就会覆盖 err_msg("connect_timeo: alarm was already set"); 继续阅读 >>


刘生玺 18/08/17 22:38:16
1. 经典“入门级”问题:IO 多路复用是什么意思? 在单个线程通过记录跟踪每一个Sock(I/O流)的状态来同时管理多个I/O流. 发明它的原因,是尽量多的提高服务器的吞吐能力。 是不是听起来好拗口,看个图就懂了.(其实就是一个时分复用)    在同一个线程里面, 通过拨开关的方式,来同时传输多个I/O流 那么,“一个请求到来了,nginx使用epoll接收请求的过程是怎样的”, 其实,ngnix会有很多链接进来, epoll会把他们都监视起来,然后像拨开关一样,谁有数据就拨向谁,然后调用相应的代码处理。 其中,“复用”指的是复用同一个线程。 其实就是操作系统为你提供了一个功能,当你的某个socket可读或者可写的时候,它可以给你一个通知,让你去处理读事件或者写事件。 而这个功能能够通过select/poll/epoll等来使用。这些函数都可以同时监视多个描述符的读写就绪状况,这样,多个描述符的 I/O 操作都能在一个线程内并发交替地顺序完成 。 2.s 继续阅读 >>


刘生玺 18/08/17 21:00:21
一、问题描述 生产者消费者问题(Producer-consumer problem),也称有限缓冲问题(Bounded-buffer problem),是一个多线程同步问题的经典案例。生产者生成一定量的数据放到缓冲区中,然后重复此过程;与此同时,消费者也在缓冲区消耗这些数据。生产者和消费者之间必须保持同步,要保证生产者不会在缓冲区满时放入数据,消费者也不会在缓冲区空时消耗数据。不够完善的解决方法容易出现死锁的情况,此时进程都在等待唤醒。 示意图: 二、解决方法 思路 采用某种机制保护生产者和消费者之间的同步。有较高的效率,并且易于实现,代码的可控制性较好,属于常用的模式。 在生产者和消费者之间建立一个管道。管道缓冲区不易控制,被传输数据对象不易于封装等,实用性不强。 解决问题的核心    保证同一资源被多个线程并发访问时的完整性。常用的同步方法是采用信号或加锁机制,保证资源在任意时刻至多被一个线程访问。 Java能实现的几种方法 wait() / noti 继续阅读 >>


李猛 18/08/16 08:40:50
三次握手与四次挥手 通过TCP/IP协议的学习,我们可以知道TCP协议是一种面向连接的、可靠的传输协议。其中,为了保证客户端与服务器连接的有效性,就有了本篇文章所要介绍的“三次挥手”;而“四次挥手”则是为了保证连接的正确断开。 1. TCP状态 首先,介绍一下TCP的几个状态: SYN —— 同步序列编号,在建立连接时发送 ACK —— 确认信息,在确认SYN信息时发送,响应信息 FIN —— 关闭连接 RST —— 连接重置 PSH —— 有数据传输 URG —— 紧急指针字段值有效 2. 三次握手 建立TCP连接时会经过如下步骤: 服务器准备接收客户端连接(通过socket API),由于连接是由客户端激发的,因此称为被动打开 客户端调用connect开始主动打开,并发送SYN(syn = i)包,告诉服务器发送数据的序列号 服务器确认(ACK,ack = i+1)客户端发来的信息(SYN),并发送SYN(syn = j),其中含有服务器发送数据的初始序列号。注:SY 继续阅读 >>


王良 18/08/15 08:58:10
关于Java线程的状态网上的说法不一,有的说是6种状态,有的说是5中状态,索性就查看了一下Java源码。Thread类里面有一个枚举类,如下: public enum State { NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED; } 这个枚举类里面有6种类型,所以Java中的线程有6种状态。 关于各种状态的简单说明: NEW(初始):线程被创建后尚未启动。 RUNNABLE(运行):包括了操作系统线程状态中的Running和Ready,也就是处于此状态的线程可能正在运行,也可能正在等待系统资源,如等待CPU为它分配时间片。 BLOCKED(阻塞):线程阻塞于锁。 WAITING(等待):线程需要等待其他线程做出一些特定动作(通知或中断)。 TIME_WAITING(超时等待):该状态不同于WAITING,它可以在指定的时间内自行返回。 TERMINATED(终止):该线 继续阅读 >>


李猛 18/08/15 08:19:50
I/O多路复用的理解 先讲一个大家都比较熟悉的例子吧 小时候咱们都喜欢看《亮剑》、《雪豹》这一类的抗日剧,里面八路军在自己的驻地周围都会24小时分布一些暗哨,每当有鬼子要进行扫荡或者清剿的时候暗哨就会赶紧告诉驻地的八路军,有敌人过来了,赶紧抄家伙干仗了。其实这就和咱们要讲的I/O多路复用有异曲同工之处。 在我们接触I/O多路复用以前,在处理一些比较多的连接或者请求的时候大多数人会去使用类似下面这种方式去处理: while(1) { int cli_fd = accept(listen_fd, (struct sockaddr*)&addrCli, sizeof(addrCli)); ...../*开启一个线程或者开启一个进程*/ } 这么做看着十分的清爽,而且实现起来也相当的简单,但是服务器的主程序会一直阻塞在accept这个函数上,然后会一直去等待connect的到来,这种方法虽然十分的简单,但是在轮询的过程中耗费了大量的CPU时间,并且效率还十分的低下,因此我们要想 继续阅读 >>


李佳灏 18/08/14 16:27:10