当前位置: 首页 > news >正文

网络编程day04(UDP、Linux IO 模型)

目录

【1】UDP

1》通信流程

2》函数接口 

1> recvfrom

2> sendto

 3》代码展示

1> 服务器代码

2> 客户端代码

 【2】Linux IO 模型

场景假设一

 1》阻塞式IO:最常见、效率低、不耗费CPU

2》 非阻塞 IO:轮询、耗费CPU,可以处理多路IO

 设置非阻塞的方式

1> 通过函数自带参数设置

2> 通过设置文件描述符的属性,把文件描述符的属性设置为非阻塞 

3》信号驱动IO/异步IO:异步通知方式,需要底层驱动的支持

 4》三种模型对比


【1】UDP

1》通信流程

服务器----------------------------------------------------------------------------》短信的接收方

  1. 创建数据报套接字(socket)------------------》有手机
  2. 指定网络信息--------------------------------------》有号码
  3. 绑定套接字(bind)------------------------------》绑定手机
  4. 接收、发送消息(recvfrom sendto)-------》收短信
  5. 关闭套接字(close)----------------------------》接收完毕

客户端---------------------------------------------------------------------------》短信的发送方

  1. 创建数据报套接字(socket)------------------》有手机
  2. 指定网络信息--------------------------------------》有对方号码
  3. 接收、发送消息(recvfrom sendto)-------》发短信
  4. 关闭套接字(close)----------------------------》发送完毕

2》函数接口 

1> recvfrom

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,

struct sockaddr *src_addr, socklen_t *addrlen);

功能:接收数据

参数:

sockfd:套接字描述符

buf:接收缓存区的首地址

len:接收缓存区的大小

flags:0

src_addr:发送端的网络信息结构体的指针

addrlen:发送端的网络信息结构体的大小的指针

返回值:

成功接收的字节个数

失败:-1

0:客户端退出

2> sendto

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);

功能:发送数据

参数:

sockfd:套接字描述符

buf:发送缓存区的首地址

len:发送缓存区的大小

flags:0

src_addr:接收端的网络信息结构体的指针

addrlen:接收端的网络信息结构体的大小

返回值:

成功发送的字节个数

失败:-1

 3》代码展示

1> 服务器代码

#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>int main(int argc, char const *argv[])
{char buf[128] = {0};int ret;// 1.创建数据报套接字(socket)------------------》有手机int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd < 0){perror("socket err");return -1;}printf("sockfd:%d\n", sockfd);// 2.指定网络信息--------------------------------------》有号码struct sockaddr_in saddr, caddr;saddr.sin_family = AF_Isaddr.sin_port = htons(atoi(argv[1]));saddr.sin_addr.s_addr = INADDR_ANY;int len = sizeof(caddr);// 3.绑定套接字(bind)------------------------------》绑定手机if (bind(sockfd, (struct sockaddr *)&saddr, sizeof(saddr)) < 0){perror("bind err");return -1;}printf("bind okk\n");// 4.接收、发送消息(recvfrom sendto)-------》收短信while (1){// 最后两个参数存放:发送消息的人的信息ret = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&caddr, &len);if (ret < 0){perror("recvfrom err");return -1;}else{printf("ip:%s port:%d buf:%s\n",inet_ntoa(caddr.sin_addr),ntohs(caddr.sin_port), buf);memset(buf, 0, sizeof(buf));}}// 5.关闭套接字(close)----------------------------》接收完毕close(sockfd);return 0;
}

2> 客户端代码

#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>int main(int argc, char const *argv[])
{char buf[128] = {0};int ret;// 1.创建数据报套接字(socket)------------------》有手机int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd < 0){perror("socket err");return -1;}printf("sockfd:%d\n", sockfd);// 2.指定网络信息--------------------------------------》有号码struct sockaddr_in saddr, caddr;saddr.sin_family = AF_INET;saddr.sin_port = htons(atoi(argv[1]));saddr.sin_addr.s_addr = inet_addr("192.168.253.145");int len = sizeof(caddr);// 4.接收、发送消息(recvfrom sendto)-------》收短信while (1){fgets(buf, sizeof(buf), stdin);if (buf[strlen(buf) - 1] == '\n')buf[strlen(buf) - 1] = '\0';if (strcmp(buf, "quit") == 0){break;}sendto(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&saddr, sizeof(saddr));memset(buf,0,sizeof(buf));}// 5.关闭套接字(close)----------------------------》接收完毕close(sockfd);return 0;
}

注意:

1.对于TCP是先运行服务器,客户端才能运行

2.对于UDP来说,服务器和客户端运行顺序没有先后,因为是无连接的,所以服务器和客户端谁先开始,没有关系

3.一个服务器可以同时连接多个客户端,想知道是哪个客户端登录,可以在服务器代码里加上打印IP和端口号的代码

4.UDP,客户端当使用send的时候,上面要加上connect,这个connect不是代表连接的作用,而是指定客户端即将要发送给谁数据,这样就不需要使用sendto而是用send就可以了

5.在TCP里,也可以使用recvfrom和sendto,使用时将后面的两个参数都写为NULL即OK

 【2】Linux IO 模型

4种:阻塞IO、非阻塞IO、信号驱动IO(异步IO)、IO多路复用

场景假设一

假设妈妈有一个孩子,孩子在房间里睡觉,妈妈需要及时获知孩子是否醒了,如何做?

  1. 一直看着他,一直在一个房间呆着:不累,但是不能处理其他的事情
  2. 时不时的进房间看看:累,但是可以处理其他事情
  3. 睡觉,听孩子哭不哭:互不耽误

 1》阻塞式IO:最常见、效率低、不耗费CPU

阻塞I/O 模式是最普遍使用的I/O 模式,大部分程序使用的都是阻塞模式的I/O 。

缺省情况下(及系统默认状态),套接字建立后所处于的模式就是阻塞I/O 模式。

学习的读写函数在调用过程中会发生阻塞相关函数如下:

•读操作中的read、recv、recvfrom

读阻塞--》需要读缓冲区中有数据可读,读阻塞解除

•写操作中的write、send

写阻塞--》阻塞情况比较少,主要发生在写入的缓冲区的大小小于要写入的数据量的情况下,写操作不进行任何拷贝工作,将发生阻塞,一旦缓冲区有足够的空间,内核将唤醒进程,将数据从用户缓冲区拷贝到相应的发送数据缓冲区。

注意:sendto没有写阻塞

1)无sendto函数的原因:

sendto不是阻塞函数,本身udp通信不是面向链接的,udp无发送缓冲区,即sendto没有发送缓冲区,send是有发送缓存区的,即sendto不是阻塞函数。

2)UDP不用等待确认,没有实际的发送缓冲区,所以UDP协议中不存在缓冲区满的情况,在UDP套接字上进行写操作永远不会阻塞。

•其他操作:accept、connect

udp丢包

 tcp粘包

tcp拆包 

 TCP粘包、拆包发生原因:

发生TCP粘包或拆包有很多原因,常见的一下几点:

1.要发送的数据大于TCP发送缓存区剩余空间大小,将发生拆包

2.待发送数据大于MSS(传输层的最大报文长度),将进行拆包(到网络层拆包-idipflags)

3.要发送的数据小于TCP发送缓存区的大小,TCP将多次写入缓存区的数据一次发送出去,将会发生粘包

4.接收数据端的应用层没有及时读取缓冲区中的数据,将发生粘包


粘包解决方法:

解决问题的关键在于如何给每个数据包添加边界信息,常用的方法有如下:

1.发送端给每个数据包添加首部,首部中应该至少包含数据包的长度,这样接收端在接受到数据后,通过读取包首部的长度字段,便可以知道每一个数据报的实际长度了

2.发送端将每个数据包封装为固定长度,这样接收端每次从接受缓冲区中读取固定长度的数据就自然而然的把每个数据包拆分开来。

3.可以再数据包之间设置边界,如添加特殊符号,这样接收端通过这个边界既可以将不同的数据包拆分开来。

4.延时发送

2》 非阻塞 IO:轮询、耗费CPU,可以处理多路IO

•当我们将一个套接字设置为非阻塞模式,我们相当于告诉了系统内核:“当我请求的I/O 操作不能够马上完成,你想让我的进程进行休眠等待的时候,不要这么做,请马上返回一个错误给我。”

•当一个应用程序使用了非阻塞模式的套接字,它需要使用一个循环来不停地测试是否一个文件描述符有数据可读(称做polling)。

•应用程序不停的polling 内核来检查是否I/O操作已经就绪。这将是一个极浪费CPU 资源的操作。

•这种模式使用中不普遍。

 

 设置非阻塞的方式

1> 通过函数自带参数设置

2> 通过设置文件描述符的属性,把文件描述符的属性设置为非阻塞 

int fcntl(int fd, int cmd, ... /* arg */ );

功能:设置文件描述符属性

参数:

fd:文件描述符

cmd:设置方式 - 功能选择

F_GETFL 获取文件描述符的状态信息 第三个参数化忽略

F_SETFL 设置文件描述符的状态信息 通过第三个参数设置

O_NONBLOCK 非阻塞

O_ASYNC 异步

O_SYNC 同步

arg:设置的值 in

返回值:

特殊选择返回特殊值 - F_GETFL 返回的状态值(int)

其他:成功0 失败-1,更新errno

使用:0为例

0-原本:阻塞、读权限 修改或添加非阻塞

int flags=fcntl(0,F_GETFL);//1.获取文件描述符原有的属性信息

flags = flags | O_NONBLOCK;//2.修改添加权限

fcntl(0,F_SETFL,flags); //3.将修改好的权限设置回去

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>int main(int argc, char const *argv[])
{//1.获取文件描述符的原有属性int flags = fcntl(0,F_GETFL);//2.修改文件描述符的属性flags = flags | O_NONBLOCK;//3.设置文件描述符的属性fcntl(0,F_SETFL,flags);char buf[32];while(1){if(fgets(buf,sizeof(buf),stdin) == NULL){perror("err\n");}else{printf("buf: %s\n",buf);}sleep(1);}return 0;
}

3》信号驱动IO/异步IO:异步通知方式,需要底层驱动的支持

异步通知:异步通知是一种非阻塞的通知机制,发送方发送通知后不需要等待接收方的响应或确认。确认发送后,发送方可以继续执行其他操作,而无需等待接收方处理通知

1.通过信号方式,当内核检测到设备数据后,会主动给应用发送信号SIGIO

2.应用程序收到信号后做异步处理即可

应用程序需要把自己的进程号告诉内核,并打开异步通知机制

//1.设置将文件描述符和进程号提交给内核驱动

//一旦fd有事件响应, 则内核驱动会给进程号发送一个SIGIO的信号

fcntl(fd,F_SETOWN,getpid());

//2.设置异步通知

int flags;

flags = fcntl(fd, F_GETFL); //获取原属性

flags |= O_ASYNC; //给flags设置异步 O_ASUNC 通知

fcntl(fd, F_SETFL, flags); //修改的属性设置进去,此时fd属于异步

//3.signal捕捉SIGIO信号 --- SIGIO:内核通知会进程有新的IO信号可用

//一旦内核给进程发送sigio信号,则执行handler

signal(SIGIO,handler);

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>int fd;void handler(int sig)
{char buf[32];printf("------------------------\n");read(fd, buf, sizeof(buf));printf("mouse: %s\n", buf);
}int main(int argc, char const *argv[])
{fd = open("/dev/input/mouse1", O_RDONLY);if (fd < 0){perror("fd err\n");return -1;}// 1.将进程号和文件描述符交给内核fcntl(fd, __F_SETOWN, getpid());// 2.设置异步通知int flags = fcntl(fd, F_GETFL);flags = flags | O_ASYNC;fcntl(fd, F_SETFL, flags);// 3.捕捉信号,做逻辑处理signal(SIGIO, handler);while (1){printf("111\n");sleep(1);}return 0;
}

 4》三种模型对比

 

阻塞 IO(Blocking IO)非阻塞 IO(Non-blocking IO)信号驱动 IO(Signal-driven IO)
同步性同步非同步异步
描述调用IO操作的线程会被阻塞,直到操作完成调用IO操作时,如果不能立即完成操作,会立即返回,线程可以继续执行其他操作当IO操作可以进行时,内核会发送信号,通知进程
特点最常见、效率低、不耗费CPU轮询、耗费CPU,可以处理多路IO,效率高

异步通知方式,需要底层驱动的支持

适应场景小规模IO操作,对性能要求不高高并发网络服务器,减少线程阻塞时间实时性要求高的应用,避免轮询开销

 今天的分享就到这里结束啦,如果有哪里写的不好的地方,请指正。
如果觉得不错并且对你有帮助的话点个关注支持一下吧!

相关文章:

网络编程day04(UDP、Linux IO 模型)

目录 【1】UDP 1》通信流程 2》函数接口 1> recvfrom 2> sendto 3》代码展示 1> 服务器代码 2> 客户端代码 【2】Linux IO 模型 场景假设一 1》阻塞式IO&#xff1a;最常见、效率低、不耗费CPU 2》 非阻塞 IO&#xff1a;轮询、耗费CPU&#xff0c;可以处…...

【android10】【binder】【2.servicemanager启动——全源码分析】

系列文章目录 可跳转到下面链接查看下表所有内容https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501文章浏览阅读2次。系列文章大全https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501 目录 …...

Java实现简易计算器功能(idea)

目的&#xff1a;写一个计算器&#xff0c;要求实现加减乘除功能&#xff0c;并且能够循环接收新的数据&#xff0c;通过用户交互实现。 思路&#xff1a; &#xff08;1&#xff09;写4个方法&#xff1a;加减乘除 &#xff08;2&#xff09;利用循环switch进行用户交互 &…...

Parsec问题解决方案

Parsec目前就是被墙了&#xff0c;有解决方案但治标不治本&#xff0c;如果想稳定串流建议是更换稳定的串流软件&#xff0c;以下是一些解决方案 方案一&#xff1a;在%appdata%/Parsec/config.txt中&#xff0c;添加代理 app_proxy_address 127.0.0.1 app_proxy_scheme http…...

Swift 创建扩展(Extension)

类别(Category) 和 扩展(Extension) 的 用法很多. 常用的 扩展(Extension) 有分离代码和封装模块的功能,例如登陆页面有注册功能,有登陆功能,有找回密码功能,都写在一个页面就太冗余了,可以考虑使用 扩展(Extension) 登陆页面的方法来分离代码 本文介绍Swift 如何创建扩展(Ex…...

九月五日(k8s配置)

一、安装环境 环境准备&#xff1a;&#xff08;有阿里云&#xff09; k8s-master 192.168.1.11 k8s-node1 192.168.1.22 k8s-node2 192.168.1.33 二、前期准备 在k8s-master主机 [rootk8s-master ~]# vim /etc/hosts …...

某极验4.0 -消消乐验证

⚠️前言⚠️ 本文仅用于学术交流。 学习探讨逆向知识&#xff0c;欢迎私信共享学习心得。 如有侵权&#xff0c;联系博主删除。 请勿商用&#xff0c;否则后果自负。 网址 aHR0cHM6Ly93d3cyLmdlZXRlc3QuY29tL2FkYXB0aXZlLWNhcHRjaGE 1. 浅聊一下 验证码样式 验证成功 - …...

洛谷 P10798 「CZOI-R1」消除威胁

题目来源于&#xff1a;洛谷 题目本质&#xff1a;贪心&#xff0c;st表&#xff0c;单调栈 解题思路&#xff1a;由于昨天联练习了平衡树&#xff0c;我就用平衡树STL打了个暴力&#xff0c;超时得了30分 这是暴力代码&#xff1a; #include<bits/stdc.h> using name…...

Pow(x, n)

题目 实现 pow(x, n) &#xff0c;即计算 x 的 n 次幂函数&#xff08;即&#xff0c;xn&#xff09;。 示例 1&#xff1a; 输入&#xff1a;x 2.00000, n 10 输出&#xff1a;1024.00000示例 2&#xff1a; 输入&#xff1a;x 2.10000, n 3 输出&#xff1a;9.26100示…...

一文带你学会使用滑动窗口

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;leetcode刷题 ​ ​ 209.长度最小的子数组 求最短长度之和等于目标值。 方法一&#xff1a; 暴力枚举&#xff08;会超时&#xff09; 从头开始遍历直到之和等于target然后更新结果。这…...

如何从0到1本地搭建whisper语音识别模型

文章目录 环境准备1. 系统要求2. 安装依赖项1:安装 Python 和虚拟环境2:安装 Whisper3:下载 Whisper 模型4:进行语音识别5:提高效率和精度6:开发和集成Whisper 是 OpenAI 发布的一个强大的语音识别模型,它可以将语音转换为文本,支持多语言输入,并且可以处理各种音频类…...

PyTorch 创建数据集

图片数据和标签数据准备 1.本文所用图片数据在同级文件夹中 ,文件路径为train/’ 2.标签数据在同级文件&#xff0c;文件路径为train.csv 3。将标签数据提取 train_csvpd.read_csv(train.csv)创建继承类 第一步&#xff0c;首先创建数据类对象 此时可以想象为单个数据单元的…...

[Java]SpringBoot登录认证流程详解

登录认证 登录接口 1.查看原型 2.查看接口 3.思路分析 登录核心就是根据用户名和密码查询用户信息,存在则登录成功, 不存在则登录失败 4.Controller Slf4j RestController public class LoginController {Autowiredprivate EmpService empService;/*** 登录的方法** param …...

【Day08】

目录 MySQL-多表查询-概述 MySQL-多表查询-内连接 MySQL-多表查询-外连接 MySQL-多表查询-[标量、列]子查询 MySQL-多表查询-[行、表]子查询 MySQL-多表查询-案例 MySQL-事务-介绍与操作 MySQL-事务-四大特性 MySQL-索引-介绍 MySQL-索引-结构 MySQL-索引-操作语法 …...

mongodb在Java中条件分组聚合查询并且分页(时间戳,按日期分组,年月日...)

废话不多说&#xff0c;先看效果图&#xff1a; SQL查询结果示例&#xff1a; 多种查询结果示例&#xff1a; 原SQL&#xff1a; db.getCollection("hbdd_order").aggregate([{// 把时间戳格式化$addFields: {orderDate: {"$dateToString": {"for…...

怎么样处理浮毛快捷又高效?霍尼韦尔、希喂、米家宠物空气净化器实测对比

掉毛多&#xff1f;掉毛快&#xff1f;猫毛满天飞对身体有危害吗&#xff1f;多猫家庭经验分享篇&#xff1a; 一个很有趣的现象&#xff0c;很多人在养猫、养狗后耐心都变得更好了。养狗每天得遛&#xff0c;养猫出门前得除毛&#xff0c;日复一日的重复磨练了极好的耐心。我家…...

什么是WebGL技术?有什么特点?应用领域有哪些?

WebGL&#xff08;Web Graphics Library&#xff09;技术是一种在Web浏览器中渲染交互式3D和2D图形的JavaScript API。以下是对WebGL技术的详细解析&#xff1a; 一、定义与起源 定义&#xff1a; WebGL全称Web Graphics Library&#xff0c;即网络图形库&#xff0c;它允许…...

500W逆变器(一)

EG8015_24V_500W 这款逆变器是基于 EG8015 SPWM 专用芯片而设计的方案。其额定的输出功率为 500 瓦, 最大输出功率为 600 瓦&#xff0c;输出电压为 220V10%&#xff0c;输出频率为 50Hz0.1Hz&#xff0c;额定输出电流为 2.3 安培。 穿越机降落的时候不要垂直降落&#xff0c;要…...

ubuntu 22.04 编译安装新内核

1、普通用户登录系统 查看当前内核版本 $ uname -r 5.15.0-118-generic 2、下载内核源码 www.kernel.org 用户home目录新建子目录linux&#xff0c;下载并解压 linux-5.15.165.tar.xz 3、创建起始的配置文件.config Configuration targets &#xff08;见linux kernel i…...

Linux 文件权限与属性管理

概述 Linux 系统是一种典型的多用户系统&#xff0c;不同的用户处于不同的地位&#xff0c;拥有不同的权限。为了保护系统的安全性&#xff0c;Linux 对不同用户访问同一文件&#xff08;包括目录文件&#xff09;的权限做了详细的规定。 文件属性查看 在 Linux 中&#xff0…...

Django学习实战篇三(适合略有基础的新手小白学习)(从0开发项目)

前言&#xff1a; 在上一章中&#xff0c;我们对Django的Model层有了比较全面的认识&#xff0c;本章就来配置Django自带的admin。这里需要认识到&#xff0c;Django的Model层是很重要的一环&#xff0c;无论是对于框架本身还是对于基于Django框架开发的大多数系统而言。因为一…...

【SPIE独立出版,连续2届稳定EI检索!】2024年第三届信息学,网络与计算技术国际学术会议(ICINC2024,10月25-27)

2024年第三届信息学&#xff0c;网络与计算技术国际学术会议(ICINC2024)将于2024年10月25-27日于中国郑州召开。 会议将围绕信息技术与通信&#xff0c;网络与计算技术等在相关领域中的最新研究成果&#xff0c;为来自国内外高等院校、科学研究所、企事业单位的专家、教授、学者…...

.NET/C#⾯试题汇总系列:基础语法

1. 字符串中string strnull和string str""和string strstring.Empty的区别&#xff1f; string str null;&#xff1a;这种方式声明了一个字符串变量str&#xff0c;并将其初始化为null。这意味着str不指向任何实际的字符串对象。如果你试图访问str的属性或方法&…...

【论文阅读】SwiftTheft: A Time-Efficient Model Extraction Attack Framework(2024)

完整标题 SwiftTheft: A Time-Efficient Model Extraction Attack Framework Against Cloud-Based Deep Neural Networks 摘要 With the rise of artificial intelligence(人工智能) and cloud computing(云计算), machine-learning-as-a-service platforms(机器学习即…...

springcloud间通信的方式

在 Spring Cloud 中&#xff0c;主要有以下几种通信方式&#xff1a; 一、基于 HTTP 的 RESTful API 工作原理&#xff1a; 这是一种常见的通信方式&#xff0c;各个微服务通过发送 HTTP 请求来相互调用。服务提供者暴露 RESTful API 接口&#xff0c;服务消费者通过 HTTP 客户…...

【C++ Qt day9】

2、将day1做的登录界面升级优化【资源文件的添加】 3、 使用手动连接&#xff0c;将登录框中的取消按钮使用第2种方式的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上…...

中国传媒业人工智能应用发展图谱2024

易观分析&#xff1a;传媒产业是指以传播各类信息、知识为核心&#xff0c;通过多种媒介形式进行内容生产、发布和分发的综合性产业。技术的进步和应用对于传媒产业发展变革起到了核心驱动力的作用&#xff0c;2022年生成式AI进入应用爆发期&#xff0c;不仅带动了人工智能产业…...

RTX3060 FP64测试与猜想

RTX3060 FP64测试与猜想 一.小结二.查看FP64的峰值性能三.打满FP64、FP32的利用率,对比差异四.进一步证明pipe_fp64_cycles_active并不是2个fp64 core的metrics RTX3060 FP64测试与猜想 一.小结 RTX3060 compute capability为8.6,每个SM有2个FP64 core。每个cycle可输出2个fp…...

uniapp写移动端常见问题汇总

1. 手机顶部状态栏遮挡 写在需要的地方 <view class"status_bar" style"height: var(--status-bar-height); width: 100%;">2. 手机顶部状态栏字体颜色 // pages.json "statusBarStyle": "light",3. 背景覆盖全屏 page{widt…...

Linux运维排查常见故障_在tmp目录下有大量包含picture_ 的临时文件,每天晚上2 30需要对一天前的文件进行

echo“”>>/etc/security/limits.conf echo“*softnproc65535″>>/etc/security/limits.conf echo“*hardnproc65535″>>/etc/security/limits.conf echo“*softnofile65535″>>/etc/security/limits.conf echo“*hardnofile65535″>>/etc/secur…...