自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

学长Online

Android Linux 疑难问题分析及在线答疑

  • 博客(23)
  • 收藏
  • 关注

原创 MSG_WAITALL和文件描述符的阻塞模式

recv函数可以设置一些标志,这也是recv和read的不同之处。其中有一个MSG_WAITALL标志,如果recv设置了这个标志,当没有收到请求的字节数时,recv函数会阻塞。然而,当被信号打断,或者发生了错误,或者断开了连接,或者接收到的下一个数据和已经接收的数据的数据类型不一致时,recv函数即使没有收到请求的字节数,也会返回,返回一个错误。由此可见,设置了MSG_WAITALL标志

2017-10-20 15:28:46 9149

原创 部分读和部分写的原因及处理方法

部分读写是指,执行read或者write操作时,读取的或者写入的字节数小于请求的字节数。部分读的原因有两个,一是接近文件末尾(EOF),二是被信号打断。部分写的原因也是被信号打断。其实,recv和send也会出现部分接收或者发送的情况,其原因都是被信号打断。、(其他原因参考man手册,此处不做赘述)那么,为了处理这种情况,只需要对信号打断情况进行处理即可,此时read,writ

2017-10-19 11:16:40 348

原创 linux下利用coredump技术追查进程崩溃原因

最近项目中出现了一个问题,服务器端程序会突然崩溃退出,我们采取了coredump技术以找到崩溃原因,即确定进程退出时正在执行的函数是哪个,其状态如何。       如果系统开启了coredump,准确的说如果当前的shell环境开启了coredump,当前shell环境下的程序崩溃退出时,会把当时进程的栈的内存状态写入core文件。使用gdb可以查看这个core文件中保存的栈的状态,gdb a

2017-03-29 12:43:28 9391

原创 GDB观察栈的内存布局

进程的内存布局如下图所示,栈是其中一块向下(低地址处)增长的内存。 栈的英文是stack,堆的英文是heap,很多人把stact翻译成堆栈,是不对的。              栈由栈帧组成。当一个函数调用时,栈会为这个函数分配一个栈帧,用于存储函数的实参、局部变量、返回值,以及函数内调用函数时,当前函数的一些寄存器的相关信息(比如用于指向下一条指令的程序计数器)。可以认为

2017-03-29 12:38:43 7325

原创 send函数可以直接发送结构体吗?

网络通信编程中,常常用结构体对待发送的数据进行封装。比如,struct msg { charcmd;  char len;  int extraData[0]; };cmd表示命令,远端会根据cmd进行不同的处理;extraData是要发送的数组;len则表示extraData的占用的内存字节数。       在这种设计下,当需要发送数据时,把根据数据长度增加整个struct msg的

2017-03-28 17:40:36 1504 1

原创 由开启coredump引起的对shell的深入探究

问题:要开coredump功能,需要把core file size的软限制值由0改为一个大于0的值,一般取unlimited。    有两个方法可以改变这个值,一个是ulimit命令,执行ulimit –c unlimited,可把core file size值设置为unlimited,但这只对当前shell有效;另一个是修改/etc/security/limits.conf文件,在该文件中加

2017-03-28 15:11:37 1661

原创 何时让指针变量指向用malloc新分配的一块内存?

定义指针,有时是为了接收函数的返回值,如DIR* opendir (const char * path ),需要定义一个DIR指针接收返回值;有时是作为函数的实参传入,如int lstat(const char *path, struct stat *buf),需要定义一个struct stat指针传入。前者只需将NULL赋值给指针,DIR *dir = NULL,因为该函数返回的是一个已经被

2017-03-14 20:38:32 2330

原创 UNIX下的5种IO模型

套接字的IO操作,如recvfrom,分为两个阶段:(1)等待内核中的接收缓冲区中有数据可读。(2)将接收缓冲区中的数据复制进应用缓冲区。调用IO操作的进程阻塞不仅指接收缓冲区没有数据时阻塞,数据到达后,从接收缓冲区复制数据时,也阻塞(难以理解)。1,阻塞式IO文件描述符open时,如果没有指定flags为O_NONBLOCK,或者open后,没有使用fcntl设置O_NONB

2016-12-13 16:29:40 877 1

原创 函数返回指针时涉及的作用域和生存期问题

今天写服务器程序时,需要在dir_list_handler函数中返回struct resp_dir_list结构体指针。这时首先想到一个问题,指针是一个变量,在函数结束时其作用域和生存期就结束了(根据内存的进程布局,函数的形参和局部变量,都存储于栈中,当函数结束时,会自动销毁这些变量),那么指针指向的内存也会被释放吗?不会。一方面,指针是局部变量,而其指向的内存不是局部变量,因此不会被释放

2016-12-06 13:40:06 711

原创 非阻塞式connect的Windows实现

下面是connect的MSDN文档。由划线部分可知,当socket设置为非阻塞模式时,connect发起后会立即返回,然而,“三次握手”却依然进行,此时,connect返回SOCKET_ERROR,WSAGetLastError()返回WSAEWOULDBLOCK。如果需要判断connect是否成功,可以使用select()函数,当connect成功时,socket文件描述符写就绪;当connec

2016-11-22 16:07:29 3030 1

原创 非阻塞式connect的Linux实现

#include #include #include #include #include #include #include #include #include #include int main(){ int sockfd; sockfd = socket(AF_INET,SOCK_STREAM,0); int flags; fl

2016-11-14 21:38:24 288

原创 非阻塞式connect的实现

本文以Windows为例讲解非阻塞式connect的实现,Linux下原理相同。    系统默认connect的超时时间是75s,现在我们想调整这个超时时间。send()和recv()函数可以通过setsockopt()函数设置阻塞后的超时时间, int timeout = 5000;//5s setsockopt(connectSocket,SOL_SOCKET,SO_S

2016-11-13 20:03:43 997

原创 struct内存对齐

struct内存对齐遵循以下两条原则:    1,  结构体中成员变量的内存地址相对于结构体首地址的偏移量,是其自身长度的整数倍。    2,  结构体变量的整体长度是其中最长成员变量长度的整数倍。    struct data{         char a;         short b;         int c;         char d;

2016-11-13 19:58:45 239

原创 8086系统中字的“对准存放”

先讲普通变量(如char short int long double)的内存对齐。    cpu根据数据总线条数分为:16位cpu(如INTEL 8086),32位cpu,64位cpu。现在Pentium以上的cpu都是64位。    cpu一次可以从内存读取的最大位数,由数据总线条数决定。16位cpu一次可以读取16位数据,32位cpu一次性可以读取32位,64位cpu一次性可以读取

2016-11-10 20:29:27 3791 2

原创 extern和头文件在多文件编译过程中的作用

多文件编译中,extern(外来的)是连接这些文件的关键。只要多个文件处于一个工程中(vs),或者使用gcc一起编译(linux,如gccfile1.c file2.c -otest),extern可以将本文件中定义的变量或者函数的作用域至其他文件,当然这些变量和函数必须是全局的。   至于头文件,其作用是把用extern声明的来自外部的变量和函数包含到本文件中。例子如下:   编译: 

2016-11-07 20:44:17 378

原创 Linux下获取内存占有率和CPU占有率

#include #include #include //Cpu(s): 0.0%us, 0.1%sy, 0.0%ni, 99.1%id, 0.6%wa, 0.0%hi, 0.1%si, 0.0%st//Mem: 1004608k total, 414696k used, 589912k free, 81872k buffers//Cpu(s): 0.0

2016-11-07 20:40:37 829

原创 C++笔记

类和结构体不同点:在结构体外部,结构体内部数据和函数都是公有的,而类内部成员可以规定公有、私有、保护这三种类型。 类继承来的成员的访问权限。P210类成员的访问权限:类内部可以随便访问任何成员,因此类成员的访问权限是指定了类外部访问类成员的权限,即通过类对象访问类成员的权限。派生类的继承属性规定了派生类外部访问派生类中继承自基类的成员的访问权限,即规定了基类成员在派生类中的属性

2016-11-07 20:34:32 200

原创 赋值过程

此处的赋值指的是把常量赋值给变量,因此首先说明两者在内存中是如何存在的。    数据分为变量和常量。我们知道变量是有数据类型的,数据类型规定了变量所占内存大小以及数据存放形式。整型数据以补码形式存放,字符型数据以其ASCII码形式存放,浮点型数据以规范化的指数形式存放(小数点前数字为0,小数点后第1位数字不为0的指数形式)。    常量也是有数据类型的,其数据类型告知计算机后,计算机将

2016-11-07 20:33:08 619

原创 linux网络编程笔记

基础知识       socket是一种IPC方法,它允许位于同一主机(计算机)或使用网络(IPV4或IPV6)连接起来的不同主机上的应用程序之间交换数据。P945       socket存在于一个通信domain中,现代操作系统至少支持下列domain:              UNIXdomain(即AF_UNIX):允许同一主机上的应用程序间通信;            

2016-11-07 20:31:57 456

原创 sscanf()中的格式说明符对数据的作用

由于sscanf与scanf的作用基本一致,后者是从控制台输入,前者是从内存中输入,此处以scanf解释格式说明符的作用。格式说明符不对数据类型进行转换,而是向计算机说明这个数据是什么类型的数据,以便计算机存储相应的二进制。  1,scanf('%x',&data);输入12,则内存中data=10010。格式说明符向计算机说明12是16进制数,12(16进制)=10010。  2

2016-11-07 20:30:44 1034

原创 sscanf()提取数据的方法

程序中常对文件中的数据处理,处理的前提是提取数据,而sscanf是提取数据的好方法。    空白符,包括空格、回车、制表符、新行垂直制表符、进纸符,将输入的数据分为不同的域(格式化符为%c时除外,可以将空白符读入)。控制字符串中,每个格式化说明符(以%开始)可以将对应的数据域的数据存储,也可以忽略(常用如%*s,%[^a-z],控制字符串中的非空白符,如%dabc%d,会把abc两边的数字忽略

2016-11-07 20:27:56 7937

原创 win32网络编程实例——重叠IO

客户端代码:#include #include #pragma comment(lib, "Ws2_32.lib")int main(){ //WSAStartup()用到 WSADATA wsaData; //WSASend()用到 WSABUF wsaBuf; unsigned int numOfBytesSent = 0; char sendbuf[1024]

2016-11-07 14:48:13 492

原创 win32网络编程实例——同步IO

服务器端代码:#include #include #pragma comment(lib, "wsock32.lib")int main(){ int iResults; WSADATA wsaData; SOCKET listenSocket; SOCKET acceptSocket; struct sockaddr_in serverAddr; char recvbu

2016-11-07 13:18:12 272

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除