自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(63)
  • 收藏
  • 关注

原创 linux下g++链接动态库和静态库

g++ main.o -L 动态库的路径 -I 头文件路径 -l动态库名字(名字不需要前缀lib和后缀.so) -static // 可以链接多个库和头文件目录。还有一个就是静态库的-fPIC选项, 当一个动态库依赖这个静态库时,由于动态库肯定是位置无关的,此时静态库被链接进去,也应该是位置无关的。之所以加-stacic, 是因为链接命令都一样,都是-L, -I, -l, 所以gcc默认使用动态库链接,连接不上再尝试用静态库链接。

2023-09-08 23:36:41 776

原创 ubuntu18.04下配置muduoC++11环境

muduo

2023-08-13 10:33:58 1019

原创 VMWare NAT模式无法联网解决

1.NAT模式下,选择的虚拟网卡是vmnet8,从虚拟网络编辑器中删除vmnet8,并重新添加;3.虚拟机中,虚拟网卡设置为NAT模式,并将网卡设置为自动获取DHCP,重启网卡,问题解决。2.host网络管理器中,设置vmnet8网络的IP和DHCP均为自动获取。VMware中ping不通host。Ubuntu18.04虚拟机。

2022-10-01 09:50:29 6137 1

原创 volatile关键字

一.前言1.编译器优化介绍:由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问。另外在现代CPU中指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令流水线,提高执行速度。以上是硬件级别的优化。再看软件一级的优化:一种是在编写代码时由程序员优化,另一种是由编译器进行优化。编译器优化常用的方法有:将内存变量缓存到寄存器;调整指令顺序充分利用CPU指令流水线,常见的是重新排序读写指令。对常规内存进行优化的时候,这

2022-05-14 17:16:22 214

原创 ubuntu14.04修改终端颜色配置

1.打开颜色配置文件vim ~/.bashrc2.文件最后一行插入如下语句PS1='${debian_chroot:+($debian_chroot)}\[\033[01;35;01m\]\u\[\033[00;31;01m\]@\[\033[01;36;01m\]\h\[\033[00;31;01m\]:\[\033[00;00;01m\]\w \[\033[01;32;01m\]\$ \[\033[01;33;01m\]'3.保存并退出,重启终端,颜色显示如下:...

2022-04-21 21:29:41 1091

原创 ubuntu更换阿里源

1、进入阿里源官方镜像站:https://developer.aliyun.com/mirror/2、点击 Ubuntu 进入3.根据不同的Ubuntu版本,选择不同的配置文件

2022-04-21 20:29:57 583

原创 强制指针类型转换对指针指向内容的影响

对指针强制类型转换,意味告诉编译器对指针指向的内容根据强制转换后的类型字节大小去截取、转换。截取的起始地址不变。#include<stdio.h>#include<stdlib.h>int main(){ int a; while(scanf("%d", &a)) { printf("%d\n", *((char *)&a)); printf("\n"); } exit(0);}...

2022-04-18 19:16:16 374

原创 指令集与汇编

1.指令集概念2.微架构3.指令和汇编关系

2022-04-12 19:28:34 639

原创 总线和地址

1.地址的本质2.总线2.1 总线编址方式

2022-04-12 18:40:31 140

原创 异构计算简介

1.定义2.DSP3.FPGA4.异构性能衡量标准

2022-04-12 18:31:39 101

原创 嵌入式笔记1

1.计算机体系结构

2022-04-12 15:09:57 86

转载 linux下阻塞和非阻塞文件读写

1.概述对于设备文件,我们可以用阻塞和非阻塞的方式读写。在阻塞方式下,若设备不可读写,则该进程休眠,释放CPU资源;若设备文件可读写,则对设备文件进行读写。在非阻塞方式下,若设备不可读写,进程放弃读写,继续向下执行;若设备文件可读写,则对设备文件进行读写。2.使用及实现原理使用:要使用非阻塞方式读写设备文件,则在调用open()函数时,添加O_NONBLOCK的mode参数,如:fd = open(“filename”, O_RDWR | O_NONBLOCK)。要使阻塞方式读写设备文件,则在调用o

2022-04-11 13:19:42 1274

原创 【无标题】

1.非阻塞IO和阻塞IO简单流程:自然流程是结构化的复杂流程:自然流程不是结构化的。可以通过有限状态机的编程方式实现程序易拓展性;1.1 fcntl()函数用途:1)对已打开的文件描述符进行各种控制操作以改变已打开文件的的各种属性,比如文件是否阻塞;2)#include<unistd.h>#include<fcntl.h>int fcntl(int fd, int cmd);int fcntl(int fd, int cmd, long arg);int fcn

2022-04-11 11:30:23 832

原创 线程(二)

8.线程-竞争故障/*@:创建20个线程,同时对1个文件内的数字进行加1*/#include<stdio.h>#include<stdlib.h>#include<pthread.h>#include<string.h>#define THRNUM 20#define FNAME "./1.txt"#define LINESIZE 1024static void *thr_add(void *p){ FILE *fp; cha

2022-04-05 21:22:27 522

原创 memset和数组初始化

1.静态数组初始化#include <cstring>int main(){ // 静态数组arr int arr[10]; // 将数组所有元素初始化为0 memset(arr,0,sizeof(arr)); // 遍历输出数组元素 for(int i=0;i<10;++i){ cout << arr[i] << endl; } return

2022-04-04 21:01:22 574

原创 并发_信号(三)

5.setitimer()现在的系统中很多程序不再使用alarm调用,而是使用setitimer调用来设置定时器,用getitimer来得到定时器的状态。误差不累计;#include <sys/time.h>int getitimer(int which, struct itimerval *curr_value); int setitimer(int which, const struct itimerval *new_value,struct itimerval *old_val

2022-04-03 15:44:00 807

原创 令牌桶算法实现

//mytdf.h#ifndef MYTBF_H__#define MYTBF_H__#define MYTBF_MAX 1024 //能够支持1024个不同速率的令牌桶typedef void mytbf_t;mytbf_t *mytbf_init(int, int);int mytbf_fetchtoken(mytbf_t *, int);int mytbf_returntoken(mytbf_t *, int);int mytbf_destroy(mytbf_t*);

2022-04-01 22:22:02 2137

原创 并发_信号(二)

6.常用函数1.kill函数#include <sys/types.h> #include <signal.h>int kill(pid_t pid, int sig);参数:pid:可能选择有以下四种pid大于零时,pid是信号欲送往的进程的标识。pid等于零时,信号将送往所有与调用kill()的那个进程属同一个使用组的进程。pid等于-1时,信号将送往所有调用进程有权给其发送信号的进程,除了进程1(init)。pid小于-1时,信号将送往以-pid为组

2022-04-01 13:00:13 298

原创 并发_信号(一)

一、信号1.信号的概念信号是软件中断。信号的响应依赖于中断;补充:中断牵涉两个概念:同步和异步;异步事件的处理方式:查询法和通知法;举例:江边钓鱼,鱼是否到来是异步事件。如果用抄网往水里抄,抄起来看有没有鱼,则为查询法;如果是用鱼竿钓鱼,观察鱼漂来看有没有鱼,则为通知法;适用场景:如果异步事件发生的比较稀疏,用通知法合适,比如监测宾馆火灾;发生频率高,查询法合适;查看终端所有信号:kill -l编号34~64为实时信号。RT代表实时信号...

2022-03-31 19:39:46 742 1

转载 linux下core文件设置与查看

1、查看系统中core文件生成的开关是否打开1)使用ulimit -c命令可查看core文件的生成开关,若结果为0,则便是关闭了此功能,不会生成core文件。2、设置core文件生成1)使用命令ulimit -c filesize命令 若ulimit -c unlimited 则标识此core文件的大小不受限制 若指定filesize,如果生成的信息超过此大小,将会被裁剪,最终生成一个不完整的core文件,在调 试此core文件时,gdb会提示

2022-03-29 20:32:12 14436 1

原创 静态库和动态库生成教程

1.静态库私家车放在哪里都可以,编译的时候装载进来。不占用调用时间,代码占用体积大。名称格式:linxx.a,其中xx 指代库名1.生成需要的.o文件2.生成libxx.a静态库ar -cr libxx.a yyy.o ///yyy需要的.o文件名3.发布库的头文件和库到指定路径/usr/local/include //头文件发布路径/usr/local/lib //.a发布路径4.使用生成的静态库生成可执行文件maingcc -L /usr/local/lib -o

2022-03-28 22:52:00 1168

原创 void指针作为函数形参的用法

void指针可以指向任意类型的数据,同时任何类型的指针都可以直接赋值给 void 指针,而无需进行其他相关的强制类型转换,可以用于封装数据结构等。如果函数的参数可以是任意类型指针,那么应该使用 void 指针作为函数的形参,这样函数就可以接受任意数据类型的指针作为参数。拿memcpy举例:void *mymemcpy (void *dst, const void *src, size_t size){ assert((dst!=NULL) && (src!=NULL));

2022-03-27 10:56:17 4571

原创 数据结构-线性表实现

1.makefileall: mainmain: main.o sqlist.o $(CC) $^ -o $@clean: rm *.o main -rf2.sqlist.c#include <stdio.h>#include <stdlib.h>#include "sqlist.h"sqlist* sqlist_create(){ sqlist *me; me = (sqlist*)malloc(sizeof(* me)); if(me ==

2022-03-25 00:32:45 1331

原创 数据结构-带头结点链表实现

1.makefileall: mainmain: main.o list.o $(CC) $^ -o $@clean: rm *.o main -rf2.list.c#include "list.h"#include <stdio.h>#include <stdlib.h>list* list_create( ){ list * me; me = (list*)malloc(sizeof(list)); if(me == NULL) re

2022-03-25 00:24:04 375

原创 数据结构-无头节点链表实现

1.makefile:all: mainmain: main.o nohead.o $(CC) $^ -o $@clean: rm *.o main -rf2.nohead.h#ifndef NOHEAD_H__#define NOHEAD_H__#define NAMESIZE 1024struct score_st{ int id; char name[NAMESIZE]; int math; int chinese;};struct node_st{

2022-03-25 00:19:39 892

原创 数据结构-单链表应用多项式

**易错点:**cur = head->next并不意味着这两个指针进行了绑定,即改变cur就会改变head->next,二者只是指向了同一个空间;如果两个都是二级指针,则对cur操作等价于对head->next操作;故cur=head后,对cur->next操作等价于对head->next操作#include <stdio.h>#include <stdlib.h>struct node_st{ int cef; int exp;

2022-03-25 00:12:53 844

原创 构造类型_结构体_共用体_枚举

1.结构体类型描述:struct 结构体名{ 数据类型 成员1; 数据类型 成员2;}; //分号不可省类型描述不占用空间,可以类比于int。定义的时候占用空间;struct smp_st{ int i; float b;}; //不占用空间struct smp_st a = {...}; //占用空间成员引用:变量名.成员名 //直接引用指针名->成员名 //间接引用(*指针).成员名结构体存储空间布局:socket传输中,结构体类型数据传给对端目

2022-03-19 22:07:17 86

原创 函数和数组_函数和指针

1.函数和一维数组void printf_arr(int *p, int n){ printf("%s %ld\n", __FUNCTION__, sizeof(p)); int i; for(i = 0; i < n; i++) { printf("%d\n", *(p + i)); }}int main(){ int arr[] = {1, 2, 3, 4, 5}; printf("%s %ld\n", __FUNCTION__, sizeof(arr

2022-03-19 13:48:18 388

原创 C语言中__FUNCTION__,__FILE__, __LINE__的用法

C/C++提供了三个宏__FUNCTION__,_FILE_和_LINE_定位程序运行时的错误。程序预编译时预编译器将用所在的函数名,文件名和行号替换。当运行时错误产生后这三个宏分别能返回错误所在的函数,所在的文件名和所在的行号。1//文件名字叫test.cpp,位于D:\test\下 #include <stdio.h>2 3 int main(int, char**)4 {5 printf("This fake error is in \"%s\" on line %d.

2022-03-18 16:05:01 920

原创 指针和数组

1.指针操作p就是i的地址,p指向i;p相对于i是房间int* 和 char* 区别在于在做查找地址里面的存储内容时,查找方式不一样;int* p表示从p作为起始地址,往下找4个字节,翻译后即为p地址存的数;char* c表示从c作为起始地址,往下找1个字节,翻译后即为i地址存的数;一个字节表示整数范围为-128~127;指针在平台所占空间是确定大小 ,无论是几级指针还是什么类型指针。64位指针大小为8,32位指针大小为4。 故能推断任何大于二级指针的查找方式都一样; int i = 1

2022-03-18 15:42:55 351 1

原创 数组知识点

1.任意进制转换,并转成字符串输出参考链接1参考链接2void itob(){ int i, num, base; int n[128]; char s[128]; char tmp[2]; printf("please input num\n"); scanf("%d", &num); printf("please input base\n"); scanf("%d", &base); do { n[i] = num % base; num /

2022-03-17 20:24:21 127

原创 字符串常用函数

一、strlen1、原型:size_t strlen(char const* string);2、功能:返回字符串 string 的长度(不包含字符串终止符NUL)3、注意:size_t是一个无符号整数类型4、举例:#include <stdio.h>#include <stdlib.h>#include <string.h>int main(){ char* y = "abcdef"; char* x = "abcd"; i

2022-03-16 23:12:06 2741 1

原创 进程基本知识-2

4、exec函数族问题:test创建到的3个子进程和test同名,为什么test是bash的子进程,却不和bash同名?可以通过exec函数实现,用一个新的进程image替换旧的进程Image,仍旧使用原来的pid;注意fflush()的使用;exec函数族之前要使用fflush()刷新所有的流;C程序空间分布,进程空间搭建时,在exec阶段,就已经有了代码段,已初始化数据段,未初始化数据段等;栈和堆是后面搭建的。//Process/sleep.c pid = fork(); if(p

2022-03-16 17:45:36 1824

原创 简单的外部命令shell实现

/*基于shell外部命令实现*/#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <glob.h>#include <string.h>#define DELIMS " \t\n"struct cmd_st{ glob_t globres;};static void promt(void){ printf("myshell-01&a

2022-03-14 22:41:16 643

原创 进程基本知识-1

1、进程标识符pid类型pid_t,一般为int16,同时产生的进程数3W多个。每个不同机器占的位不一致;常用命令:ps$: ps axf$: ps axm$: ps ax -L文件描述符fd优先使用当前范围内最小的那个,比如0,1,2被使用后,如果释放1后,在申请的文件描述符则会为当前最小值,即为1.进程号是顺次向下使用的,即使前面有释放的,也不会为前面值,直至进程号使用完一遍。然后在从头开始#include <sys/types.h>#Include <unist

2022-03-14 10:06:11 619

原创 进程环境-2

4.环境变量本质: key = value如果把操作系统类比为正在跑的程序,则环境变量就是程序需要的全局变量char* getenv(const char* name);int setenv(const char *name, const char *value, int overwrite);putenv();//FS/getenv.cint i; for(i = 0; environ[i] != NULL; i++ ) { fputs(environ[i], stdout);

2022-03-12 00:15:59 2183

原创 进程环境

1.main函数特殊规定:main函数作为程序入口和出口2.进程的终止正常终止:从main函数返回调用exit调用_exit或_Exit最后一个线程从其启动例程返回最后一个线程调用pthread_exit异常终止:调用abort作用:发送signal abort信号给当前进程,杀掉当前进程顺便得到core dump文件接到 一个信号并终止举例:程序死循环,命令中使用ctrl+c终止最后一个线程对其取消请求作出响应3.命令行参数的分析4.环境变量5.C程序的存储空间布

2022-03-10 23:55:28 135

原创 linux中time函数

时间戳的三种需求格式:time_t char* struct tm下图为三种需求格式之间相互转换需要用到的函数。time(),gmtime(),localtime(),mktime(),strftime()localtime中返回值struct tm*,指向静态区将参数4中的time按照参数3的要求获取,然后写入到参数1中。参数1的大小由参数2限制。...

2022-03-09 18:36:13 4609

原创 文件系统-目录和文件2

11.分析目录/读取目录内容glob():1.能够实现下面函数所有操作作用:帮忙分析pattern(通配符)参数详解:pattern: 模式或通配符flags:以按位或的形式把0个或多个符号信息或进参数flag里常用符号信息:int (*errfunc) (const char *epath, int eerrno):保存当前出错的路径和原因glob_t *pglob: 将解析pattern的结果存放到glob_t指针指向的地址中去(gl_pathc, *gl_pathv)

2022-03-07 23:56:12 161

原创 目录和文件

类ls的实现,myls -l -a -i -nls-nvim /etc/passwdvim /etc/group一、目录和文件递归:如果递归层数不受上限,会导致栈资源破裂1、获取文件属性2、文件访问权限3、umask4、文件权限的更改/管理:chmod,fchmod5、粘住位6 、文件系统:FAT,UFS7、硬链接,符号链接8、utime9、目录的创建和销毁10、更改当前工作路径11、分析目录/读取目录内容二、系统数据文件和信息password,group、文件权限等

2022-03-06 23:34:28 564

空空如也

空空如也

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

TA关注的人

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