- 博客(29)
- 收藏
- 关注
原创 进程间通信——SOCKET(UDP)
UDP协议:UDP不提供客户机与服务器的连接:UDP的客户机与服务器不必存在长期关系,一个UDP的客户机在通过一个套接字向一个UDP服务器发送了一个数据报之后,马上可以通过同一个套接字向另一个UDP服务器发送另一个数据报,同样,一个UDP服务器也可以通过同一个套接字接收来自不同客户机的数据报。UDP不保证数据传输的可靠性和有序性:UDP的协议栈底层不提供诸如确认、超时重传、RTT估算以及序列号等机制。因此UDP数据报在网络传输的过程中,可能丢失,也可能重复,甚至重新排序。应用程序必须自己处理这
2022-06-24 11:11:19
1592
1
原创 进程间通信——SOCKET(TCP)
套接字:基于TCP/IP协议可实现基本网络通信功能的逻辑对象。机器与机器的通信,或者进程与进程的通信,在这里都可以被抽象地看作是套接字与套接字的通信。应用程序编写者无需了解网络协议中的任何细节,更无需知晓系统内核和网络设备的运作机制,只要把像发送的数据写入套接字,或从套接字中读取想接收的数据即可。#includeint scoket(int domain,int type,int protocol)功能:创建套接字参数:domain:通信域,协议族,可取以下值: .........
2022-06-16 15:49:47
1356
原创 进程间通信————消息队列
消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
2022-06-07 20:53:11
218
原创 进程间通信————共享内存
共享内存是进程间通信(IPC)中最简单的方式之一,也是最快的IPC形式。共享内存允许两个或多个进程访问同一块内存。当一个进程改变了这块内存中的内容的时候,其他进程就可以察觉到这种更改。一旦这样的内存映射到共享它的进程的地址空间,这些进程间的数据传递将不再涉及到内核,即进程不再通过执行进入内核的系统调用来传递数据,而是这些进程通过共享内存来传递数据。...
2022-06-07 10:45:53
4091
原创 进程间通信———管道
有名管道:可以用在任意两个或者多个进程之间 是一种特殊的文件,它的路径名存在于文件系统中,通过 mkfifo命令可以创建管道文件,
2022-06-07 10:27:14
239
原创 创建新进程
与fork()不同,exec函数不是创建调用进程的子进程,而是创建一个新的进程取代调用进程自身,新进程会用自己的全部地址空间,覆盖调用进程的空间,但进程的PID保持不变
2022-06-01 13:03:06
1207
原创 子进程得回收
子进程的回收:#include<sys/wait.h>pid_t wait(int *status)功能:(阻塞函数)等待并回收任意子进程参数:status 用于输出子进程的终止状态,可置NULL返回值:成功返回所回收的子进程的PID,失败返回-1父进程在创建若干自己进程以后调用wait函数:A.若所有子进程都在进行,则阻塞,知道有子进程终止才返回B.若有一个子进程已终止,则返回该子进程的PID并通过status参数输出其终止状态C.若没有任何可被等待并回收的子进程,则返回-
2022-05-31 21:37:01
261
原创 进程的创建与终止
进程:正在执行的程序命令ps查看进程,pstree查看所有进程命令top相当于任务管理器,动态变化进程的信息父子孤尸:父子进程:父进程可以有多个子进程,一个子进程只能有一个父进程调度进程:PID =0孤儿进程:父进程先于子进程结束(一种状态),(老版本)操作系统会为子进程找父进程,即被init进程收养,init进程又被称为孤儿院进程,(新版本)随机进程收养僵尸进程:父子进程同时执行,子进程先于父进程结束,子进程还有部分资源在内存中占用,父进程负责释放,但由于某种原因,父进程并没有回收
2022-05-30 21:26:57
336
原创 读写冲突、文件锁
#include <fcntl.h>int fcntl(int fd, F_SETLK/F_SETLKW , struct flock* lock);功能:加解锁参数:F_SETLK 非阻塞模式加锁F_SETLKW 阻塞模式加锁lock 对文件要加的锁返回值:成功返回0,失败返回-1struct flock {short l_type; // 锁类型:F_RDLCK/F_WRLCK/F_UNLCKshort l_whence;// 锁区偏移起点: SEEK SET/SEEK
2022-05-28 12:21:00
447
原创 基于LINUX的文件系统、文件类型、文件的打开与关闭、文件的内核结构
文件系统:物理结构:每个磁盘由多个盘片构成,每张盘片由多个磁道构成,每个磁道按照512字节等分,每等份叫做扇区,越靠近外圈扇区越多。柱面:不同盘片相同半径的磁道所组成的圆柱称为柱面,整个磁盘的柱面与每张磁盘的磁道数相同。磁盘中的每个扇区由磁头号、柱面号、扇区号唯一确定。数据块:存储文件内容块位图:记录0和1,一个byte位对应一个数据块,记录数据块使用情况i节点映射表:记录i节点编号和磁盘上存储对应位置,帮助找到i节点的位置。磁盘中的每个文件或目录都有唯一的一个的i节点与之对应。每个i
2022-05-26 17:27:59
495
原创 基于LINUX下的内存管理
内存管理:虚拟内存的分配和释放sbrk:相对路径,分配方便brk:绝对路径,整体一次性释放,指针跳转到第一次分配之后的前一个位置#include<stdio.h>#include<unistd.h>//sbrk 和brk 函数的调用int main(){ /*printf("%p\n",sbrk(0)); int * int_p = sbrk(4); *int_p = 32; printf("%p\...
2022-05-25 20:59:16
91
原创 基于LINUX的虚拟地址空间、内存壁垒、段错误
虚拟地址空间:程序中看到的地址并不是物理内存地址,而是由系统内核的内存管理系统管理后看到的虚拟地址。物理内存有自己的地址,操作系统会维护一张映射表,表里面是虚拟地址和物理地址的映射关系,每个进程都有一张自己的映射表。CPU中由一个MMU存储单元,负责虚拟地址和物理地址转换。虚拟地址空间:就是一个虚拟地址范围,32位操作系统有4G虚拟内存:范围0~3G-1 用户使用 3G~4G-1 内核使用64位操作系统:用户:0x0000 0000 0000 0000 ~ 0x0000 ffff f..
2022-05-25 16:19:42
173
原创 错误处理及GDB调试
错误处理:#include<stdio.h>#include<stdlib.h>#include<string.h>#include<errno.h>//使用全局变量errnoint main(){ void *p = malloc(0Xffffffffffffffff); if(p == NULL) { printf("errno =%d\n",errno);//获取错误号 //std
2022-05-24 17:04:21
255
原创 静态库和动态库
静态库:将多个目标文件打包一个文件 扩展名 .a里面是.o可执行文件1:gcc -c clc.c show.c //生成执行文件.o2:ar -r libmath.a clc.o show.o//加载到静态库中ar [选项] 静态库文件.a 目标文件列表.o-r 将目标插入到静态库中,已存在更新-q 将目标文件追加到静态库尾-d 从静态库中删除目标文件-t 列表显示静态库中的目标文件-x 将静态库展开为目标文件库文件名:libmath.a3:gcc main....
2022-05-24 14:43:10
124
原创 LINUX系统下的环境变量(附带环境变量表操作函数程序)
什么是环境变量:每个进程都有一张自己的环境变量表,表中得每个条目都是形如“键=值”。全局环境变量:通过env查看,可以被shell子进程所继承。局部环境变量:不能通过env查看,只对当前shell可见。环境变量的查看与设置命令env:查看当前进程得环境变量命令echo $:查看键对应得值添加键值:直接写FOOD(键)=temp(值) (添加为局部变量) 注意等号两边不要有空格export name:将name局部环境变量变为全局环境变量unset name:删除name环境变量.
2022-05-24 14:08:09
202
原创 LINUX多文件实现双链表(C语言)附带Makefile
主函数测试代码#include"list.h"int main(){ list_t list; list_init(&list); list_add(&list,10); list_add(&list,20); list_add(&list,30); list_add_head(&list,40); list_add_tail(&list,50); list_travel(&li...
2022-05-19 09:43:16
223
原创 LINUX多文件实现队列(C语言)附带Make file
#include"queue.h"int main(void){ queue_t queue; queue_init(&queue,4); for(int i = 10;i<=40;i+=10) { if(!queue_full(&queue)) { queue_push(&queue,i); } } printf("有效数据个数:%d\n",queue...
2022-05-18 13:00:57
428
原创 LINUX多文件实现单链表(C语言)附带Make file
//单链表声明#ifndef __LIST_H#define __LIST_H#include<stdio.h>#include<stdlib.h>//节点信息typedef struct node{ int data;//数据 struct node *next;//下一个节点}node_t;//链表信息typedef struct list{ struct node *head;//头节点 struct node *tai...
2022-05-18 12:55:17
299
原创 C++实现基数排序(详细代码)
#include<iostream>using namespace std;#include<algorithm>#define NUM 10void print(int* p, int len);void radix_sort(int *arr,int len,int max){ //创建临时数组 int * p = new int[max + 1]; //初始化数组 fill(p, p + max + 1, -1); //fo...
2021-12-15 09:25:48
1547
原创 C++实现归并排序(详细代码)
#include<iostream>using namespace std;#define num 10void merge(int* a, int len);void merge(int* a, int l, int m, int r);//归并排序//把一个数组拆成两等份 递归 void mergeSort(int * a,int l, int r){ if (l == r) { return; } int m = l ...
2021-11-10 13:55:33
5942
原创 C++实现二分查找详细代码
两种实现方法:1、利用循环直接找2、利用递归思想#include<iostream>using namespace std;#define num 15void print(int* arr, int len);int half_find(int* arr, int len, int findData);int half_find(int* arr, int l, int r, int findData);int main(){ int arr[num];...
2021-11-08 08:48:11
838
原创 汉诺塔问题C++实现代码
汉诺塔是常见的一种用递归思想去解决的问题,其主要思路如下:汉诺塔中有n个圆盘,将第1个到第(n-1)个看成一个盘,由于(n-1)盘上面的盘都比这个盘要小,所以用(n-1)的盘代替上面所有盘进行移动,所以只有两个盘子在汉诺塔上的移动是A->B,A->C,B->C,n盘到达最终位置后,对之前(n-1)盘再次进行类似于n盘的一样的操作。直到n为1时停止,递归结束。代码如下:#include<iostream>using namespace std;int cowu
2021-10-28 15:54:09
2447
原创 C++实现简易hash
哈希的组成: 1.确定数据范围 2.合适的查找hash函数 根据数据返回数据所在内存段首地址 2.1科学计数法 节省空间 效率高 插入删除不好 在最开始要设计好 3.解决hash冲突的方式 向下链表代码:#pragma once#include<iostream>using namespace std;#include<string>#include<...
2021-10-26 09:59:02
823
原创 C++中set和multiset
Set 和map的区别 :set<T>sSet的key就是自己的value 不能使用[]进行插入Multiset和set的区别 允许重复 不会覆盖代码:#include<iostream>using namespace std;#include<set>int main(){ //set键值只有一个value 不能使用中括号插入 set<int>s; set<int>::iterator...
2021-10-25 14:59:08
70
原创 C++中map和mulitmap的用法、区别及常用函数的使用
Map:key value 自动按照键值排序 一个键值对应一个元素,如果有多个,后面放入的覆盖前面放入的。Multimap:map 的升级版本允许同一个键值对应多个元素,不能用[]来插入都建议用insert(pair)插入map容器代码:#include<iostream>using namespace std;#include<map>//泛型//template<class t1, class t2>//void func(t1 ...
2021-10-25 14:47:57
471
原创 C++自写栈模板
#pragma oncetemplate<class T>class MyStack{ T* pBuff; size_t capacity; size_t len;public: MyStack() { pBuff = NULL; capacity = len = 0; } ~MyStack() { if (pBuff) { dele...
2021-10-22 20:36:32
152
原创 C++实现shell排序算法
shell排序特点:插入排序的优化 步长(开始设置步长为元素个数除以2) 步长此排序:每次排序完步长减一 每次排序都以步长为间隔给所有元素分组,组内做插入排序。#include<iostream>using namespace std;#include<vector>#include<algorithm>#include<list>#define NUM 10void shell(int* arr, int len ){ /...
2021-10-21 10:52:52
471
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人