
c
文章平均质量分 80
z_ryan
这个作者很懒,什么都没留下…
展开
-
linux下测试写满cpu
在编写测试程序时,采用多线程,为了使线程不因为时间片耗尽而被切换,将线程的调度策略设置为SCHED_FIFO,优先级设置为最大,每个线程处理的逻辑为一个死循环,使线程一直处于RUNNING态,一直占用cpu。测试代码如下(testcpu.c):原创 2017-11-29 17:36:46 · 3150 阅读 · 0 评论 -
线程控制原语小结
在本篇博客中主要总结一下linux下,线程的一些控制原语。 在Linux环境下,所有线程特点,失败均直接返回错误号。所以我们可以利用strerror()将错误信号所代表的具体错误打印出来。参数为发生错误所返回的错误信号。例如: ret = pthread_create(&tid ,NULL ,thrd_func ,NULL);if(ret != 0){ fpri...原创 2018-03-20 21:39:53 · 1315 阅读 · 0 评论 -
malloc的底层实现(ptmalloc)
前言 本文主要介绍了ptmalloc对于内存分配的管理。结合网上的一些文章和个人的理解,对ptmalloc的实现原理做一些总结。内存布局 介绍ptmalloc之前,我们先了解一下内存布局,以x86的32位系统为例: 从上图可以看到,栈至顶向下扩展,堆至底向上扩展, mmap 映射区域至顶向下扩展。 mmap 映射区域和堆相对扩展,直至耗尽虚拟地址空间中的剩余区域,...原创 2018-04-15 16:54:44 · 30264 阅读 · 5 评论 -
部分重要的SOCKET选项
首先介绍两个专门用来读取和设置socket文件描述符属性的系统调用getsockopt() && setsockopt()函数原形://读取socket文件描述符的属性int getsockopt(int sockfd , int level , int option_name , void* option_value , socklen_t* rest...原创 2018-05-28 17:58:05 · 1087 阅读 · 0 评论 -
frok 与 vfork
一、首先看一个程序:#include <stdio.h>#include <sys/wait.h>#include <unistd.h>Int main(){Int i = 0;For(i = 0 ; i < 2 ; i++){Fork();Printf(“-”);}Wait(NULL);Wait(NULL);Retur...原创 2018-06-25 19:04:40 · 1243 阅读 · 0 评论 -
深度剖析c语言main函数---main函数的返回值
在接下来的几篇博文中,我将对c语言的main函数进行深入的剖析,分别从函数返回值,函数参数,以及函数的执行顺序对main函数作一总结。本文主要聊聊main函数的返回值。main函数的返回值 main函数的返回值用于说明程序的退出状态。如果返回0,则代表程序正常退出。返回其它数字的含义则由系统决定。通常,返回非零代表程序异常退出。void main() 有一些书上的,都使...原创 2018-07-09 23:19:06 · 32195 阅读 · 0 评论 -
深度剖析c语言main函数---main函数的参数传递
在上文中,我们主要讲了c语言main函数的返回值问题,本文主要将main函数的参数传递。main函数传参 首先说明的是,可能有些人认为main函数是不可传入参数的,但是实际上这是错误的。main函数可以从命令行获取参数,从而提高代码的复用性。函数原形 为main函数传参时,可选的main函数原形为:int main(int argc , char* argv[],cha...原创 2018-07-10 00:20:38 · 18937 阅读 · 4 评论 -
深度剖析c语言main函数---main函数的执行顺序
在之前的文章中,介绍了main函数的返回值 和 main函数的传参,本文主要介绍一下main函数的执行顺序。可能有的人会说,这还用说,main函数肯定是程序执行的第一个函数。那么,事实果然如此吗?相信在看了本文之后,会有不一样的认识。为什么说main()是程序的入口 linux系统下程序的入口是”_start”,这个函数是linux系统库(Glibc)的一部分,当我们的程序和Gl...原创 2018-07-10 14:09:37 · 9388 阅读 · 1 评论 -
浅析dup()和dup2()函数
前言 在linux下,一切皆文件。当文件被打开时,会返回文件描述符用于操作该文件,从shell中运行一个进程,默认会有3个文件描述符存在(0、1、2);)0表示标准输入,1表示标准输出,2表示标准错误。一个进程当前有哪些打开的文件描述符可以通过/proc/进程ID/fd目录查看。 今天,我们主要说两个用于复制文件描述符的函数dup()和dup2()。dup()、dup2()函数...原创 2018-06-29 09:05:24 · 13192 阅读 · 1 评论 -
C函数的调用过程原理和栈分析
在编程中,相信每个人对函数都不陌生,那么你真正理解函数的调用过程吗?当一个c函数被调用时,一个栈帧(stack frame)是如何被建立,又如何被消除的。本文主要就是来解决这些问题的,不同的操作系统和编译器可能有所不同,本文主要介绍在linux下的gcc编译器。栈帧 我们先来看一下,一个典型的栈帧的样子: 首先介绍一下这里面非两个重要的指针:ebp和esp; ...原创 2018-07-13 12:01:57 · 5474 阅读 · 0 评论 -
线程与进程的简单比较
本篇文章主要对线程与进程之间的区别作一简单总结,从内核实现的区别,双方的地址空间、共享的数据、操作原语的比较和多线程与多进程的区别这几方面,做一简单说明。1、Linux内核线程实现原理 Unix系统中,早期是没有“线程”概念的,80年代才引入,借助进程机制实现出了线程的概念。因此在这类系统中,进程和线程关系密切。 1. 轻量级进程(light-weight process),也...原创 2018-03-20 20:32:03 · 1509 阅读 · 0 评论 -
字符串分割函数--strtok与strsep
在c/c++中,字符串分割函数主要有两种:一是strtok函数,另一个就是strsep函数。下面我们对这两个函数作一个详细解释说明。1、strtok原形: char* strtok(char *str, const char *delim);功能: 分解字符串为一组字符串;str为要分割的字符串,delim为分隔符;返回值: 从str开头开始的一原创 2018-02-04 14:02:06 · 3794 阅读 · 2 评论 -
红黑树
前言 提到红黑树,我们首先得知道二叉查找树(Binary Search Tree),也称二叉搜索树,有序二叉树,排序二叉树,是指一颗空树,或者具有以下性质的二叉树: (1)若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值; (2)若任意节点的右子树不空,则右子树上的所有节点的值均大于它的根节点的值; (3)任意节点的左、右子树也分别为二叉查找树;原创 2018-01-19 19:33:06 · 1238 阅读 · 0 评论 -
进程那些事
1、进程与程序的区别 程序,是指编译好的二进制文件,是静态的。在磁盘上,不占用系统资源例如:cpu,内存等。 进程,是一个抽象的概念,与操作系统原理紧密相关。进程是活跃的程序,占用系统资源。在内存中执行。包括了动态创建、调度和消亡的整个过程。一旦程序运行起来就会产生一个进程。在linux中,通过进程控制块来描述进程。例如:当我们编写一个c程序并将其编译之后,此时可执行的二进制文件并不能原创 2018-01-21 22:58:00 · 1293 阅读 · 0 评论 -
信号
1、概念 提及信号我们首先想到的是什么?有人想到赛场上裁判的信号枪,有人想到路口的红绿灯……;信号在我们生活中随处可见。在计算机中,信号是信息的载体,Linux/UNIX 环境下,古老、经典的通信方式, 现下依然是主要的通信手段。在这篇文章中我们就主要聊聊信号。基本属性 信号的基本属性可以总结为两方面,即:软中断和时延性。 例如:A给B发送信号,B收到信号之前执行自己的代原创 2018-01-22 18:23:41 · 2503 阅读 · 1 评论 -
柔性数组(变长数组)
前言 我们平时在写C程序时,我们经常会使用数组来存放一些字符串或者其他数据。但是,在使用数组之前,我们都必须指定数组的大小。当我们知道所要存放数据的大小时还好,但是当我们还无法预先知道存放数据的大小时,我们必须指定足够大的空间来存放数据。这样往往会浪费许多空间; 有人说,我们可以利用指针,额外开辟空间存放数据,这样形式上之战有那个一个指针的空间,但是,使用指针的话,需要多次分配, 多原创 2018-01-22 22:30:03 · 1333 阅读 · 0 评论 -
大小端及网络字节序
什么是大端模式、小端模式 “大端”和”小端”表示多字节值的哪一端存储在该值的起始地址处;小端存储在起始地址处,即是小端字节序;大端存储在起始地址处,即是大端字节序;具体的说: ①大端字节序(Big Endian):最高有效位存于最低内存地址处,最低有效位存于最高内存处; ②小端字节序(Little Endian):最高有效位存于最高内存地址,最低有效位存于最低内存处。原创 2018-01-22 23:58:21 · 30709 阅读 · 7 评论 -
c程序编译全过程解析
前言 当我们编写好c程序之后,经过编译便可运行得出结果。但是,我们所编写的程序别人可以看懂,但是机器却看不懂。为了在系统上运行这个程序,该源程序需要被其他程序转化为一系列低级机器语言指令,然后将这些指令按照可执行目标程序的格式打包并以二进制磁盘文件形式存储起来。这个过程就是编译过程。从源程序到可执行文件 源程序经过编译成为可执行文件。具体经历了以下几个过程:预处理–>编译–>汇编–原创 2018-01-23 17:40:41 · 1731 阅读 · 0 评论 -
一致性hash详解
需求 我们都知道,任何一种算法的的出现都源于需求。人们需要用它来更好的解决问题。那么,一致性hash算法的出现是源于什么需求呢?例如:在使用n台缓存服务器时,一种常用的负载均衡方式是,对资源o的请求使用hash(o)=o mod n 来映射到某一台缓存服务器。当增加一台服务器时,其hash函数相应就得变为:hash(o)=o mod (n + 1);反之,当 减少一台缓存服务器时,其hash原创 2018-01-25 19:35:53 · 1445 阅读 · 0 评论 -
c语言中的各种“零”
在c语言中,存在各种各样的“零”。例如:0,‘0’,NULL等。下面我们就具体介绍一下这些”零“:零的含义 零值 意义 备注 0 整型数据的0 0.0 实型数据的0 NULL 指针型数据的0 内存的0地址,用于初始化暂时不用的指针。或是标识已经被释放堆内存的指针。 ‘\0’ 转义字符型(ASCII值为0)原创 2018-01-24 21:41:07 · 9827 阅读 · 0 评论 -
mem系列函数源码实现
1、memcmp ①、原形:int memcmp(const void *buffer1, const void ,*buffer2, int count); ②、功能:比较内存区中指定count个字符的大小; ③、代码#include#includeint my_memcmp(const void *buf1,const void *buf2,int n);int原创 2018-02-03 22:26:38 · 1627 阅读 · 0 评论 -
str系列源码小结
1、strcmp ①、原形:int strcmp(const char * str1, const char * str2) ②、功能:比较两个字符串的大小 ③、代码#include#includeint my_strcmp(const char* str1,const char* str2);int main(){ int ret = 0; ch原创 2018-02-03 23:11:45 · 1387 阅读 · 0 评论 -
网络编程的三个重要信号(SIGHUP ,SIGPIPE,SIGURG)
对于信号的介绍,我再前面的一篇博客中做过专门的总结,感兴趣的可以看看。本文主要介绍在网络编程中几个密切相关的函数:SIGUP,SIGPIPE,SIGURG。SIGHUP信号 在介绍SIGHUP信号之前,先来了解两个概念:进程组和会话。进程组 进程组就是一系列相互关联的进程集合,系统中的每一个进程也必须从属于某一个进程组;每个进程组中都会有一个唯一的 ID(process...原创 2018-07-07 16:25:19 · 47124 阅读 · 3 评论