自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux中Makefile的配置

文章目录一、make概述二、make的语法三、makefile的初级版本四、makefile中的变量1.自定义变量2.make工具给makefile传值4.预定义变量一、make概述gcc的编译过程及分析问题gcc 编译的时候不会检查文件是否被修改过,直接重新编译所有源文件(造成大量的重复编译)make 编译的时候会检查文件是否被修改过,只编译被修改过的源文件(避免大量的重复编译)make 大量代码的关系维护(类似于windows中集成开发环境的工程项目维护)二、make的语法目标:依赖文件

2021-04-09 23:22:15 936

原创 Linux系统编程之网络编程二(基于socket)

文章目录一、socket服务器与客户端的开发步骤1、服务端2、客户端二、步骤实现1、创建套接字2、绑定信息地址转换API3、监听客户,客户连接服务器4、接受请求5、数据交互6、断开连接三、demo一、socket服务器与客户端的开发步骤1、服务端创建套接字为套接字添加信息(IP地址和端口号)监听网络连接监听到有客服端接入,就收一个连接数据交互关闭套接字,断开连接2、客户端创建套接字为套接字添加信息(IP地址和端口号)连接到服务器数据交互关闭客户端,断开连接二、步骤实现

2020-11-28 16:09:22 285

原创 Linux系统编程之网络编程一

一、

2020-11-28 15:09:00 194

原创 Linux系统编程之线程三

文章目录一、条件变量二、条件变量的运用1.条件变量的创建及销毁2.等待3.触发一、条件变量条件变量是线程另一可用的同步机制。条件变量给多个线程提供了一个会合的场所。条件变量与互斥量一起使用时,允许线程以无竞争的方式等待特定的条件发生。条件本身是由互斥量保护的。线程在改变条件状态前必须首先锁住互斥量,其他线程在获得互斥量之前不会察觉到这种改变,因为必须锁定互斥量以后才能计算条件。条件变量使用之前必须首先初始化,pthread_cond_t数据类型代表的条件变量可以用两种方式进行初始化,可以把常量PTH

2020-11-27 22:30:30 131

原创 Linux系统编程之线程二

文章目录一、互斥量二级目录三级目录一、互斥量互斥量(mutex)从本质上来说是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁。对互斥量进行加锁后,任何其他试图再次对互斥量加锁的线程将会被阻塞直到当前线程释放该互斥锁。如果释放互斥锁时有多个线程阻塞,所有在该互斥锁上的阻塞线程都会变成可运行状态,第一个变为可运行状态的线程可以对互斥量加锁,其他线程将会看到互斥锁依然被锁住,只能回去等待它重新变为可用。在这种方式下,每次只有一个线程可以向前运行。在设计时需要规定所有的线程必须遵守相同

2020-11-22 22:07:22 343

原创 Linux系统编程之线程一

文章目录一、进程和线程的区别二、使用线程的理由理由一理由二三、线程的优点四、线程的创建pthread_creatdemo一、进程和线程的区别典型的UNIX/Linux进程可以看成只有一个控制线程:一个进程在同一时刻只做一件事情。有了多个控制线程后,在程序设计时可以把进程设计成在同一时刻做不止一件事,每个线程各自处理独立的任务。进程是程序执行时的一个实例,是担当分配系统资源(CPU时间、内存等)的基本单位。在面向线程设计的系统中,进程本身不是基本运行单位,而是线程的容器。程序本身只是指令、数据及其组织形

2020-11-22 21:32:10 85

原创 Linux系统编程之信号量

一、什么是信号量为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域。临界区域是指执行数据更新的代码需要独占式地执行。而信号量就可以提供这样的一种访问机制,让一个临界区同一时间只有一个线程在访问它,也就是说信号量是用来调协进程对共享资源的访问的。信号量是一个特殊的变量,程序对其访问都是原子操作,且只允许对它进行等待(即P(信号变量))和发送(即V(信号变量))信息操作。最简单的信号量是只能取0和1的

2020-10-21 19:48:17 598

原创 Linux系统编程之共享内存

一、什么是共享内存顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一样。而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。1、shmget函数该函数用来创建共享内存,它的原型为:int shm

2020-10-21 19:29:37 246

原创 Linux系统编程之消息队列

消息队列是消息的链接表,Unix的通信机制之一,可以理解为是一个存放消息(数据)容器。将消息写入消息队列,然后再从消息队列中取消息,一般来说是先进先出的顺序。可以解决两个进程的读写速度不同(处理数据速度不同),系统耦合等问题,而且消息队列里的消息哪怕进程崩溃了也不会消失。最简单的消息内存的使用流程①ftok函数生成键值②msgget函数创建消息队列③msgsnd函数往消息队列发送消息④msgrcv函数从消息队列读取消息⑤msgctl函数进行删除消息队列1.ftok函数生成键值每一个消息队列都

2020-10-21 18:42:11 289

原创 Linux系统编程之管道通信

@TOC无名管道(半双工)局限性:数据自己读不能自己写。数据一旦被读走,便不在管道中存在,不可反复读取。由于管道采用半双工通信方式。因此,数据只能在一个方向上流动。. 只能在有公共祖先的进程间使用管道。有名管道(全双工)...

2020-10-20 21:03:15 172

原创 Linux进程编程之system和popen

system函数原型:int system(const char * string);函数说明system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。返回值如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1。若参数string为空指针(NULL),则

2020-09-23 11:00:55 172

转载 Linux进程编程之父子进程的等待

编程过程中,有时需要让一个进程等待另一个进程,最常见的是父进程等待自己的子进程,或者父进程回收自己的子进程资源包括僵尸进程。这里简单介绍一下系统调用函数:wait()函数原型是#include <sys/types.h>#include <wait.h>int wait(int *status)函数功能是:父进程一旦调用了wait就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,

2020-09-22 23:11:03 427

原创 Linux进程编程之进程的退出

文章目录一、进程正常终止二、进程异常终止一、进程正常终止在main函数内执行return语句调用exit函数调用_exit或_Exit进程的最后一个线程在其启动例程中执行return语句进程的最后一个线程调用pthread_exti函数二、进程异常终止调用abort当进程接收到某些信号时最后一个线程对“取消”请求做出相应进程结束的本质不管进程如何终止,最后都会执行内核中的同一段代码。这段代码为相应进程关闭所有打开描述符,释放它所使用的存储器等...

2020-09-22 22:47:57 103

原创 Linux进程编程之进程的创建

文章目录一、基础概念1.什么是程序,什么是进程,有什么区别?2.如何查看系统中有哪些进程?3.什么是进程标识符?4.什么是父进程?什么是子进程?5.c语言的存储空间是如何分配?三级目录一、基础概念1.什么是程序,什么是进程,有什么区别?程序是一个静态概念,我们用c语言写一个代码,编译器编译之后生成的文件就是一个程序。进程则是一个动态概念,只要程序一旦运行起来了,系统中就多了一个进程,相当于系统多了一个任务。两者区别就在于,一个是静态的,一个是动态的。2.如何查看系统中有哪些进程?使用 ps(ps

2020-09-22 16:51:01 220

原创 复杂度分析

一、什么是复杂度分析?1.数据结构和算法解决是“如何让计算机更快时间、更省空间的解决问题”。2.因此需从执行时间和占用空间两个维度来评估数据结构和算法的性能。3.分别用时间复杂度和空间复杂度两个概念来描述性能问题,二者统称为复杂度。4.复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系。二、为什么要进行复杂度分析?1.和性能测试相比,复杂度分析有不依赖执行环境、成本低、效率高、易操作、指导性强的特点。2.掌握复杂度分析,将能编写出性能更优的代码,有利于降低系统开发和维护成本。三、如

2020-09-04 15:40:05 261

原创 何为数据结构,何为算法,为何要学习

一、何为数据结构,何为算法从广义上讲,数据结构就是指一组数据的存储结构。算法就是操作数据的一组方法。图书馆储藏书籍你肯定见过吧?为了方便查找,图书管理员一般会将书籍分门别类进行“存储”。按照一定规律编号,就是书籍这种“数据”的存储结构。那我们如何来查找一本书呢?有很多种办法,你当然可以一本一本地找,也可以先根据书籍类别的编号,是人文,还是科学、计算机,来定位书架,然后再依次查找。笼统地说,这些查找方法都是算法。从狭义上讲,也就是我们专栏要讲的,是指某些著名的数据结构和算法,比如队列、栈、堆、二分查找、

2020-09-04 10:44:07 182

转载 Linux中的open与C库中的fopen的区别(其他也类似)

来源从来源的角度看,两者能很好的区分开,这也是两者最显而易见的区别:open是UNIX系统调用函数(包括LINUX等),返回的是文件描述符(File Descriptor),它是文件在文件描述符表里的索引。fopen是ANSIC标准中的C语言库函数,在不同的系统中应该调用不同的内核api。返回的是一个指向文件结构的指针。PS:从来源来看,两者是有千丝万缕的联系的,毕竟C语言的库函数还是需要调用系统API实现的。移植性这一点从上面的来源就可以推断出来,fopen是C标准函数,因此拥有良好的.

2020-09-03 16:08:09 255

原创 Linux文件编程练手项目二

项目: 查找并修改文档中的字符思路: 先打开需要操作的文件,读取文档,利用strstr函数查找需要修改的字符,将读的buf重新写入文档中,最后关闭文档#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <stdio.h>#include <unistd.h>#include <string.h>#include <stdlib.

2020-09-02 10:47:11 176

原创 Linux文件编程练手项目一

项目: 实现文件cp指令#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <stdio.h>#include <unistd.h>#include <string.h>#include <stdlib.h>int main(int argc,char **argv){ char *buf = NULL; int

2020-09-01 17:56:21 193

原创 Linux文件操作及编程

文章目录一、文件基本操作1、文件与目录的检测与创建文件ls、touch2、拷贝,删除与移动cp、rm、mv二、文件的编程操作1、文件的打开及创建函数打开函数open创建函数create2、文件的写入函数write一、文件基本操作1、文件与目录的检测与创建文件ls、touchls查看文件或者是目录的相关信息(非隐藏文件的文件名,以文件名进行排序及文件名代表的颜色显示如此)。 -l长数据串行出,包含文件的属性与权限等等数据,-a全部的文件连同隐藏文件一起列出来,-d 仅列出文件本身,而不列出目录内的文件数

2020-09-01 10:50:30 185

原创 C语言项目之学生成绩管理系统

项目目标:链表A,每个节点存放一个新的链表B1,B2,B3,B4,B5的头结点。场景:一个年级,相当链表A该年级5个班,每个班5个人,相当于链表B1–B5做一个学生成绩管理系统学生成绩有语文 数学 英语功能: 录入成绩 找最三科总分的最高分 最低分 算出平均分思路:定义两个结构体,一个为学生单独的链表,存储学生的姓名和成绩,和下一个同学的地址。另一个为班级的链表,存储班级里面各班开头的学生的地址,和下一个班级的地址,利用班级链表查找计算班级的各个同学的情况。用到的只要核心代码尾插法动态创

2020-08-28 12:46:21 573 2

原创 C语言项目之贪吃蛇(Linux下ncurses环境)

1.地图创建#include <curses.h>void initncurses(){ initscr();//ncurses初始化界面函数 keypad(stdscr,1);}void printPic(){ int i; int j; for(i=0;i<=20;i++){ if(i==0||i==20){ for(j=0;j<20;j++){ printw("--"); } }else{ for(j=0;j<=

2020-08-28 12:20:17 1158 1

原创 C语言之数据结构——链表二

文章目录链表节点的删除链表节点的改变链表的头创建法链表的尾创建法链表节点的删除struct Link *delLink(struct Link *head,int data){ struct Link *p = head; if(head->data == data){ head

2020-08-23 11:25:27 129

原创 C语言之数据结构——链表

文章目录链表的查找链表的个数计算链表的尾插法链表的头插法链表的查找int findLink(struct Link *head,int data){ struct Link *point; point = head; while(point !=NULL){ if(point->data == data){ return 1; } point = point->next; } return 0;}链表的个数计算int totalLinkNum(

2020-08-18 22:15:14 147

原创 C语言之数据结构——链表1

链表的基本定义思想#include <stdio.h>struct Link{ int data; struct Link *next; };int main(){ struct Link t1 = {1,NULL}; struct Link t2 = {2,NULL}; struct Link t3 = {3,NULL}; t1.next = &t2; t2.next = &t3; printf("%d,%d,%d\n",t1.data,

2020-08-18 22:07:01 379

原创 C语言的32个关键字

C语言的关键字共有32个,根据关键字的作用,可分其为数据类型关键字、控制语句关键字、存储类型关键字和其它关键字四类。1 数据类型关键字(12个):(1) char :声明字符型变量或函数 (2) double :声明双精度变量或函数 (3) enum :声明枚举类型 (4) float:声明浮点型变量或函数 (5) int: 声明整型变量或函数 (6) long :声明长整型变量或函数 (7) short :声明短整型变量或函数 (8)

2020-08-16 12:07:50 117

转载 C语言结构体的计算思路和方法

我们实际生活中,保存的数据一般不会是同一种类型,所以引入了结构体。而结构体的大小也不是成员类型大小的简单相加。需要考虑到系统在存储结构体变量时的地址对齐问题,虽然对齐方式占空间,但是按照计算的访问规则,这样提升了效率。,结构体内的排列顺序是按占内存多少来的,无论是从大到小,还是从小到大,或者是杂乱无章,都是从字符的一个到double的八个字节排列的,所以同一个内容的结构体,无论内部数据类型是按什么样子排列,内存大小只有一个。由于存储变量地址对齐的问题,结构体大小计算必须满足两条原则:一、结构体成员的偏移

2020-08-16 11:37:07 1010

原创 指针、数组、结构体综合

#include <stdio.h>#include <stdlib.h>struct Student{ char* name; float score;};struct Student* initStudentScore(int len){ int i; struct Student *p=NULL; p=(struct Student*)malloc(len*sizeof(struct Student)); memset(p,'\

2020-08-16 09:03:32 141

原创 C语言之玩结构体数组

#include <stdio.h>#include <stdlib.h>struct Student{ char* name; float score;};int main(){ struct Student stu[3]; int i; for(i=0;i<sizeof(stu)/sizeof(stu[0]);i++){ printf("请输入第%d个学生的名字:\n",i+1); stu[i].name=(ch

2020-08-16 09:00:37 206

原创 C语言常用字符串函数三

文章目录strlwr小写与strupr大写strtok分割strlwr小写与strupr大写原型:extern char *strlwr(char *s);用法:#include <string.h>功能:将字符串s参数转换为小写形式说明:只转换s参数中出现的大写字母,不改变其它字符。返回指向s参数的指针。兼容性说明:strlwr和strupr不是标准C库函数,只能在VC中使用。linux gcc环境下需要自行定义这个函数。大写与小写函数用法一样。转换大小写这两个函数进行操作的字符

2020-08-13 12:29:08 217 1

原创 C语言字符串常用函数二

文章目录strncpy数字多少拷贝strcat拼接strcmp比较strchr查找strstrstrncpy数字多少拷贝定义于 string.h。语法形式为:char *strncpy(char *dest, const char *src, int n),表示把src所指向的字符串中以src地址开始的前n个字节复制到dest所指的数组中,并返回被复制后的dest。strcat拼接把src所指向的字符串(包括“\0”)复制到dest所指向的字符串后面(删除dest原来末尾的“\0”)。要保证dest

2020-08-13 12:19:12 156

原创 字符串常用函数一

文章目录putsgetsstrlenmemsetstrcpyputsgetsstrlenmemsetstrcpy一、puts头文件:#include <string.h功能:将字符串输出到终端,puts函数一次只能输出一个字符串,字符串中可以包括转义字符。用法:char puts(const char *string);二、gets头文件:#include <string.h功能:读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符

2020-08-13 12:05:36 172

原创 C语言之字符串的定义和strlen的运用

这里写目录标题字符串的定义strlen的运用字符串的定义字符串的定义通常有三种不同的情况,你属于哪种呢?1.掉渣款 int i; char str[5]={'a','b','c','d','e'}; for(i=0;i<(sizeof(str)/sizeof(str[0]));i++){ printf("%c",str[i]); }这种定义方式比较的费时费力2.经典款int i;char str2[5]="abcde"; for(i=0;i<(si

2020-08-12 16:40:42 400

原创 C语言之内存泄漏

一、什么是内存泄漏程序刚跑起来很好,跑几个小时,或几周,或几个月程序崩溃,类似于wile(1){sleep(1);int* p=malloc(1024);}这种情况就是一种典型的内存泄漏,运行一段时间后,程序崩溃,malloc申请的空间系统不会主动释放,在Linux中,程序结束,系统会自动回收空间。二、怎么避免内存泄漏1.注意程序中有没有一直循环的申请内存空间2.及时合理的运用free§;p=NULL;动态释放空间...

2020-08-12 11:10:13 502

原创 不同类型的指针

不同类型的指针这里写目录标题不同类型的指针指针数组数组指针函数指针无类型指针指针数组数组指针函数指针无类型指针

2020-08-12 10:23:15 450

原创 指针的用法二

指针的用法二在函数和指针的结合当中,形参和实参的区别就体现的淋漓尽致,例如情况一在不使用指针的情况下,形参的各种变化均不会影响实参的变化,本质上还是两者的地址的不同。在使用指针的情况下,实参第地址发送给了形参指针,相当于直接对实参的数据进行了实际的改变,因此指针本质还是通过利用地址唯一性来改变函数调用中形参与实参的不同的漏洞。...

2020-08-11 11:50:17 88

原创 指针的用途一

指针的用途一指针的第一个用途就是可以用指针来进行更换内存位置,我们都知道在程序编写的世界,都会跟内存有联系,而在C语言中,指针作为C语言的精华,其一就是可以更改变量的地址名,给变为内存的任意位置,像其他语言,例如Java表示很无奈,如以下程序大家就来看看,指针式如何来改变内存位置的。#include <stdio.h>#include <stdlib.h>int main(){ int a; int* p; a=10; p=&a;

2020-08-11 10:37:11 382

原创 C语言之指针的基本知识

@[TOC]指针介绍访问变量的三种方式一、直接通过变量名访问printf("直接通过变量名来访问:juHuaTai=%d\n",juHuaTai);printf("直接通过变量名来访问:meiGuiTai=%d\n",meiGuiTai);二、间接访问1、通过地址访问printf("间接通过地址来访问:meiGuiTai=%d\n",*(&meiGuiTai));2、通过指针访问int* p;p=&juHuaTai;printf("间接通过地址来访问:juHuaT

2020-08-11 10:16:08 433

原创 wemos开发之手动控制蜂鸣器

#define BEEP D5void setup() { Serial.begin(115200);//波特率为115200 pinMode(BEEP,OUTPUT);//设置引脚为输出 digitalWrite(BEEP,HIGH);//将蜂鸣器初始化为高电压,阻止开始时就鸣叫}void loop() { int cmd; if(Serial.available()>0)//检测是否有数据 { .

2020-08-01 22:48:24 165

原创 wemos开发之实现蜂鸣器

void setup() { // put your setup code here, to run once: pinMode(D5,OUTPUT);//将D5引脚初始化为输出模式}void loop() { // put your main code here, to run repeatedly: digitalWrite(D5,HIGH);//D5进行高电压 delay(1000); digitalWrite(D5,LOW);/

2020-07-28 23:52:59 123

空空如也

空空如也

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

TA关注的人

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