- 博客(81)
- 收藏
- 关注
原创 UDP编程
通常使用“点分十进制”字符串表示IP地址,用3个“.”划分成四个区。每个区的表示范围为0~255端口号具有2个字节16个比特位的整数IP是将数据从A主机交付给B主机端口号用来标识一个进程,一个端口号只能被一个进程占用IP地址+端口号=套接字,可以进行数据层面的来往,本质上就是进程间的通信端口号和进程ID的区别:每一个进程都需要有PID,但不是所有进程都有端口号,除非这个进程...
2018-08-28 09:34:26
247
原创 进程间关系和守护进程
进程间关系:进程组、作业、会话进程组:一组进程的集合,这组进程拥有相同的进程组id,可以接收来自同一终端的各种信号创建一个进程组:用sleep 100|sleep 200| sleep 300来创建三个进程,这三个进程属于一个进程组这时我们发现他们的PGID都是2439 说明他们都在2439这个进程组进程组组长退出进程组不会退出,只要进程组中一个进程存在,这个进程组就存...
2018-08-26 10:58:37
285
原创 【图解】数据包在局域网与广域网内的传递
ISO/OSI参考模型:物理层:电气特性,设备规范,传输数据的单位是bit,这一层的设备有网卡。数据链路层:数据成帧(物理层上的数据填头填尾即加上数据来源去向,检测错误(CRC循环冗余校验码))链路:没有其他设备的一段线路链路层能收到哪些数据:1.发给自己的 2.广播数据 3.组播数据主要设备:交换机网络层:功能:1.在网上找最优的路径将源端将数据送到目标端 ...
2018-08-23 11:16:24
2641
原创 【经典面试题】生产者消费者模型
条件变量条件变量是利用线程间共享的全局变量进行同步的一种机制。主要包括两个动作:一个线程等待“条件变量的条件成立”而挂起,另一个线程让“条件成立(给出条件成立信号)”作用:为了防止竞争注意事项:条件变量的使用总是和一个互斥锁结合在一起1.pthread_cond_t cond; //定义条件变量的全局变量2.pthread_cond_init(&cond,NULL...
2018-08-22 16:47:21
1672
原创 线程终止与互斥量
线程终止:void pthread_exit(void *retval);retval参数,是线程退出的返回值,不关心可以直接给NULL指定取消某个线程:pthread_cancel(tid);具体使用代码: 1 #include<stdio.h> ...
2018-08-22 14:20:08
258
原创 线程基本概念及创建
线程:一个进程内部的控制序列并发:一个CPU多个进程并行:CPU足够多,一个进程可以分配一个CPU,可以同时运行linux中用进程来模拟线程,即轻量级进程cpu调度时以PCB为基本单位的我们所说的进程是具有一个或多个执行流的线程组(即所有PCB组成的线程组)进程与线程的区别:进程是操作系统分配资源的基本单位线程是CPU调度的基本单位 进程有自己独立的地址空间,每启动一...
2018-08-20 11:42:09
184
原创 信号的内核表示
信号在内核中的三种状态:阻塞、未决、递达(这里也可以用handler表示处理),如下图:递达:执行信号处理动作称为信号的递达(delivery)未决:从信号的产生到信号的递达之间的状态称为未决(peeding)阻塞:进程可以阻塞(block)信号,这时信号处在未决状态,直到进程接触对信号的阻塞,才执行递达动作修改block的值:sigprocmask(int how,c...
2018-08-20 10:16:45
318
原创 信号的基本概念及用法
什么是信号:信号是事件发生时对进程的通知机制,有时也称为软件中断。信号与硬件中断的相似之处在于打断了程序执行的正常流程,大多数情况下,无法预测信号到达的准确时间信号源:1.硬件2.软件 (如ctrl+c 结束进程就是一个信号源)常见的几种进程信号解释:SIGHUP 关闭终端时会产生SIGINT 按下ctrl+C 发送给进程的信号SIGQUIT 按下ctrl+/ 发送...
2018-08-13 11:25:22
611
原创 【编程】利用共享内存和信号完成进程间通信
题目要求:两个进程之间有序完成一个写一个读,顺序打印0~100解题思路:要完成一个进程写另一个进程读,就必须要保证两个进程可以访问同一块地址空间,这里我们就可以使用共享内存,要有序就要同步使用信号量来控制。我们设定信号量为1,进程1先P申请信号量完成写的工作后V释放信号量,这时进程2再P申请信号量完成读的工作后再V释放信号量,依次类推就可以完成有序的读写所用主要函数:创建或打开...
2018-08-13 10:52:20
536
原创 【详解】进程间通信之信号量
临界资源:具有排他性的资源临界区:访问临界资源的代码段信号量的本质就是计数器互斥访问 操作系统的P操作就是上锁,V操作就是解锁上锁() 解锁() { ...
2018-08-12 10:14:33
11483
4
原创 【详解】进程间通信之共享内存
共享内存图示说明:实现机制:共享内存时通过把一块内存分别映射到不同的进程空间中实现进程间通信。而共享内存本身不带任何互斥与同步机制,但当多个进程同时对同一个内存进行读写操作时会破坏该内存的内容。所以,在实际中,同步与互斥机制需要用户来完成。头文件:#include<sys/shm.h>#include<sys/ipc.h> 创建或打开共享内存...
2018-08-10 21:31:54
329
原创 【详解】进程间通信之消息队列
消息队列:操作系统在内核中创建一个队列,使得用户进程可以一个放数据,一个取数据,消息队列中的每个节点存放的信息有:消息类型号、消息的长度、消息的具体内容,具体情况如图:所引用的头文件:#include<sys.msg.h>#include<sys/ipc.h>打开或者创建一个消息队列:msgget(key_t key,int flags)内核...
2018-08-10 20:29:14
200
原创 命名管道的理解与用法
命名管道的创建:int mkfifo(const char*pathname,mode_t mode);pathname创建管道的名字,mode给的权限,权限依然收到umask影响mkfifo创建命名管道文件,文件的大小永远为0,表示不占用磁盘的大小,它是用一个名字代表内核上的一块缓存,没有亲缘关系的进程可以通过名字拿到内核上的这块缓存,值得注意的是要写的时候读写管道必须同时打开对...
2018-08-08 20:53:41
2027
1
原创 利用管道实现ls -l| wc -l 命令
思路:子进程实现ls -l命令将结果返回给父进程,父进程再实现wc -l命令在具体实现之前需要弄清一个dup函数:int dup(int oldfd)作用:文件描述符的复制,可以实现文件共享实现:从小到大找第一个未使用的文件描述符, 让他和oldfd指向同一个文件表,操作任何一个都是访问同一个文件返回值:调用成功返回新的文件描述符,失败返回-1具体使用代码: 1 #...
2018-08-08 19:39:53
10399
原创 进程间通信之管道
进程间通信(IPC)目的:让不同进程之间进行数据传输、资源共享、事件通知、进程控制进程间通信发展史:1.管道 2.systemV IPC : 消息队列(数据传输) 共享内存(数据共享) 信号量(事件通知)3.POSIX IPC: ...
2018-08-05 17:24:59
145
原创 linux动态库的创建与使用
动态库(共享库):动态库时一个包含可由多个程序同时使用的代码和数据的库,它是为了解决相同的机器码在物理内存上存储多份的问题在物理内存上存放一份,哪个进程需要可以将这个代码映射到自己的虚拟地址空间上(共享存储映射区),它的位置在栈和堆之间动态库的打包与使用:1.生成动态库:gcc -fPIC -shared -o lib动态库名.so xxx.c PIC:位置无关...
2018-08-04 14:33:23
2197
1
原创 linux下的静态库的打包与使用
静态库:作用:对一系列.o文件打包,方便使用生成方法:ar -cr lib库名.a 文件使用:gcc main.c -L寻找库:默认缺省路径:/lib64 /usr/lib64自定义查找路径: -L 库路径实际操作一次:我创建了一个文件用来存放加减乘这样的.c .h文件现在我要使用这些文件,第一步我就时让他们变成.o文件再利用gc...
2018-08-03 20:58:53
2926
原创 文件系统必备知识点
文件相关系统调用接口:以open函数调用为例,其打开后返回文件描述符具体步骤如图:PCB中fds(文件描述符)专门用来存储已打开的文件,它是一个数组类型文件表中存储文件的打开标志、当前读写位置、引用计数、指向v节点的指针,v节点中存有指向i节点的指针在linux下我们ls获取的信息就来自v节点表,i节点表中存放的是磁盘数据的存储位置引用计数(refcnt):表示有几个文...
2018-08-03 19:33:24
448
原创 实现Linux下的cp命令
cp命令的作用:读取源文件写到目标文件具体实现思路:1.打开源文件,先判断argc==3,argv[0]为可执行程序的名字,argv[1]为源文件,argv[2]为目标文件2.当源文件存在的时候用O_EXCL进行一次提示3.当源文件与目标文件都正确打开后,循环读取源文件写入目标文件4.完成实现后可以用vimdiff 文件A 文件B 可以比较两个文件相同与否具体实现代码:...
2018-08-01 17:09:12
1912
原创 操作系统基本的接口函数
文件描述符:操作系统通过一个整数代表打开的文件,这个整数就被称为文件描述符,windows上称为文件的句柄,进程能够打开的文件描述符的范围[0,1024] ,我们可以用ulimit-n查看。有三个文件描述符进程一创建时就打开的标准输入stdin:0 标准输出stdout:1 标准错误stderroe:2 操作系统提供的基本接口函数:op...
2018-08-01 16:16:36
2338
原创 进程创建之fork与vfork
虚拟地址与物理地址的映射关系(借助页表)由图中的映射关系我们可以发现,虚拟地址与物理地址并不是一一对应的,这样也就会出现一种问题,一个变量地址相同内容不同,其实是虚拟地址相同,所对应的物理地址不同的原因那么是谁管理着虚拟地址空间呢?pcb中有mm_strct管理虚拟地址空间linux中错误提示linux中绝大多数函数出错返回值都是-1,函数出错后将错误编号放入errno全局变量...
2018-07-30 16:07:16
194
原创 linux环境变量
环境变量:一般是指在操作系统中用来指定操作系统运行环境的一些参数环境变量在系统当中通常具有全局特性常见的环境变量:PATH*:指定命令的搜索路径HOME*:指定用户的主工作目录,即登录到linux时默认的目录HISTSIZE*:指保存历史命令记录的条数SHELL*:当前Shell,它的值通常是/bin/bash环境变量相关命令:env :查看全部的环境变量e...
2018-07-29 16:29:28
117
原创 linux进程(2)之走入进程的内心世界
在上一讲了解了进程的基本知识后,我们再次深入了解进程,了解僵尸进程,孤儿进程,以及进程的优先级问题Z(zombie)僵尸进程子进程退出,父进程还在运行,但是父进程没有读取子进程的退出状态,子进程就进入僵死状态。僵死进程会以终止状态保存在进程表中,并且会一直等待父进程读取退出状态码。在这里为了方便理解我们创造一个30秒的僵尸进程 1 #include<stdio.h>...
2018-07-28 16:15:52
114
原创 Linux进程概念
冯诺依曼体系结构:这里的存储器指的是内存,在不考虑缓存的情况下,输入输出设备只能与内存进行数据写入或读取,不能直接与CPU“沟通”内存可以与任何设备直接进行打交道操作系统OS(基本的程序集合):是一款纯正“搞管理”的软件1.内核(文件管理、进程管理、内存管理、驱动管理)2.其他程序(shell程序、函数库等等)设计OS的目的:1.管理所有的硬件程序2.为用户程序...
2018-07-28 11:00:33
113
原创 图解希尔排序
希尔排序:不稳定,时间复杂度 平均时间 O(nlogn) 最差时间O(n^s) 1<s<2具体实现思路如图:实现代码如下:void swap(int *a, int* b){ int tmp; tmp = *a; *a = *b; *b = tmp;}void ShellSort(int *a, int len){ if (len <= 1)...
2018-07-26 21:44:33
215
原创 图解插入排序
插入排序(升序):稳定,时间复杂度 O(n^2)具体实现思路如图:具体实现代码如下:void InsertSort(int *a ,int len){ if (len <= 1) { return; } int count = 1; for (; count < len; count++) { int tmp = a[count]; int ...
2018-07-26 19:54:22
180
原创 图解选择排序
选择排序(升序排列):不稳定,时间复杂度 O(n^2)核心思想就是打擂台,初始状态我们默认选择第一个元素作为擂主,让它依次与其他元素比较,如果小于它,那么swap两个元素,依次类推,最后的元素就是按从小到大排列。具体实现步骤如图: 具体实现代码如下:void swap(int *a, int* b){ int tmp; tmp = *a; *a = *b; *b...
2018-07-26 19:42:35
718
原创 快速排序
大致思路:1 . 先从数列中取出一个数作为基准数。2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。3.再对左右区间重复第二步,直到各区间只有一个数。核心思想:挖坑填数+分治具体实现:具体代码:#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdl...
2018-07-24 15:48:24
158
原创 memmove
函数作用:用于从src拷贝count个字节到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域区域的字节拷贝到目标区域中,但复制后src内容会被更改,但是当目标区域与源区域没有重叠则和memcpy函数功能相同。memmove可以被分为三种情况:1.dest<src,源内存的首地址大于目标内存的首地址,进行正向拷贝,此时无需担心dest+coun...
2018-07-23 22:41:08
2067
原创 memset函数实现
memset函数的作用:以dest为起始位置的n个字节的内存区域用整数set来进行填充,len为要填充的字节数,返回值为目标dest内存的起始地址特别说明:len表示的是字节数,函数是以字节的形式每次赋值给目标地址具体实现代码:#include<stdio.h>#include<stdlib.h>void *my_memset(void *dest, ...
2018-07-23 15:08:41
7043
2
原创 memcpy函数实现
memcpy函数作用:将由src指向地址为起始地址的连续n个字节的数据复制到以dest指向地址为起始地址的空间内,函数返回一个指向dest的指针特别说明:1.src和dest所指内存区域不能重叠2.与strcpy相比,memcpy遇到‘\0’并不会结束,而是一定会拷贝完n个字节3.memcpy可以拷贝任何数据类型的对象,可以指定拷贝的数据长度4.如果dest本身就有数据,执...
2018-07-23 12:53:02
15688
5
原创 模版
函数模板格式:template <class 形参名1, class 形参名2, class 形参名n>返回类型 函数名(参数列表) { ... }模板形参的定义既可以使用class,也可以使用typename,含义是相同的。模版函数的实例化:编译器调用模版函数时,编译器会根据传递的参数自动推演出模版形参的类型,并自动生成对应的代码...
2018-07-22 12:30:53
145
原创 模拟实现strcmp
strcmp函数的作用:比较两个字符串的大小。将两个字符串从左向右进行逐个字符比较(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。两个字符串相同时返回0,第一个字符串大于第二个字符串时返回一个正值,否则返回负值。具体实现代码:#include<stdio.h>#include<stdlib.h>int my_strcmp(char*strin...
2018-07-20 16:04:57
320
原创 模拟实现strcpy
strcpy函数的作用:把从src地址开始且含有‘\0’结束符的字符串复制到以dest开始的地址空间,返回值的类型为char *。实现思路:用while循环将src中的字符一个个赋值给dest,两个指针++具体实现代码:#include<stdlib.h>#include<stdio.h>char* my_strcpy(char*strdest, char...
2018-07-20 15:20:02
425
原创 模拟实现strlen的三种方法
在模拟实现strlen之前我们首先要明白strlen的作用:1.计算字符串s的(unsigned int)型长度2.返回s的长度不包括"\0",这里要与sizeof加以区分实现思路:1.使用计数器count,每移动一次指针,count++,直到遇到“\0“”停止2.使用两个指针访问同一块(即该字符串)地址空间,一个指针保持不动,另一个指针不断遍历直到遇到“\0“”停止,两个指针...
2018-07-20 14:31:58
155
原创 二维数组的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数解题思路:这个题有两种想法,第一种:遍历,以matrix[0][0]开始依次遍历二维数组中每一个元素直到找到待查找的数number为止,或者遍历完没有找到报错。第二种:因为数组是有序数组,那我们可以取右上角为起始点进行比较,比...
2018-07-19 17:30:54
152
原创 查找单链表倒数第K个结点
在这里我们介绍一种简单的思路:定义两个指针(fast和slow)都指向头结点,fast指针先走K-1次后slow指针再走,当fast->next==NULL的时候,slow指针指向的位置就是我们所要找的倒数第K个节点为了便于理解我们画图示意:在理解了思路后实现时还需要注意如下几个问题:1.空指针的判断,当链表的头指针为空时,这属于非法输入,应该直接返回2.当要查找倒数...
2018-07-19 14:25:34
1128
原创 将字符串转换为整数
这是一道经典的面试题,在收到这样一道题时我们不要急于动手,先思考一下这道题的解决思路:1.在函数调用时我们需要用指针来接收数组的地址,那么指针是否需要判空?2.如果获取的字符串起始位出现“+”"-"号该如何处理?3.如果获取到的并非数字字符串该如何处理?4.如果获取的字符串正确,该如何返回成整数形式?5.如过获取的字符串带符号,返回的整数是否应该变为负数?理清了思路,下面我...
2018-07-19 11:01:10
262
原创 简易日期计算器
日期计算器的功能应该包含:日期+/-天数=返回日期日期+/-日期=返回天数在日期与天数的运算中,以日期+天数为例我们需要考虑如下几点:1.二月份的天数受闰年影响2.当日期day出现大于当月天数时,month++,当month>13时,day++并且month=13.当所加天数为负数时,可以转化成减法运算在日期与日期的运算中,如果单纯用两个日期相加减则需要考虑比较年...
2018-07-18 14:51:29
806
原创 软件测试基础
软件测试的生命周期需求分析-->测试计划-->测试设计、测试开发-->测试执行-->测试评估具体内容:需求阶段:了解需求、对需求进行分解得出测试需求计划阶段:编写测试计划、方案设计阶段:搭建测试用例框架、根据需求和设计编写一部分测试用例编码阶段:计划执行单元测试、完善、细化测试用例以及调整测试计划和方案(编写测试用例的同时也是对需求进行测试,需求也是...
2018-07-17 17:46:32
160
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人