自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 树莓派wiringPi库控制sg90舵机

https://zhuanlan.zhihu.com/p/267042615

2021-12-13 23:07:06 490

原创 最基本的Makefile编写

最基本的Makefile编写工程文件夹下有 main.c f1.c f2.c head.h 四个文件Makefile可以省略头文件text:f1.o f2.o main.o //生成text的目标文件 gcc main.o f1.o f2.o -o text //具体生成的执行命令f1.o:f1.c //生成f1.o 的目标文件 gcc -c -Wall f1.c -o f1.o //具体生成的执行命令f2.o:f2.c gcc -c -Wall

2021-09-29 11:56:07 246

转载 https协议详解

本文转载至 https://www.cnblogs.com/xietianjiao/p/13260021.html

2021-09-07 10:51:02 118

原创 linux设置开机启动可以修改哪些文件实现

linux设置开机启动可以修改哪些文件实现1、在etc/init/bootmisc.sh.conf 文件里面加入指令2、在etc/rc.local 文件里面加入指令

2021-08-15 11:01:45 351

原创 交叉编译是什么?为什么要交叉编译?如何安装交叉编译器

交叉编译是什么?为什么要交叉编译?如何安转交叉编译器是什么:交叉编译就是在一个平台上生成另一个平台的可执行代码比如我们在Windows系统编写c51代码编译生成xx.hexxx.hex是在c51上面运行,并不是在Windows上运行stm32也是一样的还比如我们在Ubuntu上面编译树莓派上可执行的代码,如a.out是在树莓派上运行,并不是在Ubuntu linux上运行为什么要交叉编译?1、有时候目标平台上不允许、不能够安装我们需要的编译器,如C512、目的平台资源匮乏,无法运行我们需

2021-08-13 11:44:18 950

原创 树莓派中用超声波测距实例

树莓派中用超声波测距实例超声波的工作原理就是测量超声波在空气中传播的世间,从而通过时间算出距离。首先让 Trig引脚发送一个10us的高电平作为触发信号,这时候Echo引脚就会一直处于高电平的状态,直到有波传回来才会变成低电平。首先了解一下 struct timeval这个时间结构体struct timeval{__time_t tv_sec; /* Seconds. */ 秒数__suseconds_t tv_usec; /* Microseconds. */ 微妙数};还有

2021-08-12 10:24:34 229

原创 linux库之静态库与动态库的概念及生成和使用

linux库之静态库与动态库的概念及生成和使用库的概念:一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用。程序函数库可以使整个程序更加模块化,更容易重新编译,而且更方便升级。1、静态函数库,是在程序执行前就加入到目标程序中去了 ;一般是以 .a作为后缀优点:1、静态库被打包到应用程序中加载速度快2、发布程序无需提供静态库,因为已经在APP中,移植方便缺点:1、链接时需完整的拷贝到可执行文件中,被多次使用就会有多份拷贝,占用内

2021-08-10 10:41:58 96

原创 程序使用分文件编程的好处

程序使用分文件编程的好处首先我们要知道什么是分文件编程,就是把我们的程序代码划分成多个文件,这样就不会把所有的代码都放在main.c里面,采用分模块的编程思想,进行功能划分,把每个功能不一样的单独放在一个c文件里,然后写头文件把它封装成可调用的一个函数,在主函数调用这个封装好的函数,编译的时候一起编译即可。好处:分模块的编程思想a.功能责任划分b.方便调试c.主程序简洁代码示例main.c注意:自己写的头文件用" " 不要用<> 1 #include<stdio.h&g

2021-08-10 10:16:40 514

原创 基于socket的网络编程(实现服务器与客户端的互发消息)

基于socket的网络编程(实现服务器与客户端的互发消息)服务器API解析Socket() 申请一个套接字接口Bind()为套接字添加信息(ip地址和端口号)Listen()监听网络连接Accept()监听到有客户端接入,接受一个连接Read()读取数据Write()发送数据Close()关闭套接字,断开连接客户端API解析Socket() 申请一个套接字接口connect()连接到服务器Read()读取数据Write()发送数据Close()关闭套接字,断开连接服务器代码#

2021-08-05 10:58:16 508

原创 UDP与TCP的区别

UDP与TCP的区别1、TCP面向连接(如拨打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接。2、TCP提供可靠的服务,也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大的努力交付,既不保证可靠服务。3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的,UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)。4、每一条TCP连接只能是点到点的;UD

2021-08-04 10:51:18 109

原创 线程中的条件锁

线程中的条件锁线程的主要API1、创建及销毁条件变量#include <pthread.h>int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);int pthread_cond_destroy(pthread_cond_t *cond);// 返回:若成功返回0,否则返回错误编号除非需要创建一个非默认属性的条件变量,否则pthread_cont

2021-08-02 10:32:08 148

原创 线程中什么情况下会造成死锁

线程中什么情况下会造成死锁什么是死锁?死锁:假如你有两把锁a、b,当线程1拿到锁a的时候又想去拿锁b,线程2拿到了锁b又想去拿锁a,这时候两个线程竞争谁也拿不到锁,导致线程无法运行下去,造成了死锁。代码验证如下#include<stdio.h>#include<pthread.h>//int pthread_create(pthread_t *thread, const pthread_attr_t *attr, // v

2021-08-02 10:02:18 471

原创 线程中的互斥锁

线程中的互斥锁及API互斥锁的应用场景就是让几个线程一个一个的执行,一个线程执行完毕才执行下一个线程,那么就让这几个线程去竞争这把锁,通过加锁解锁操作即可。1、 创建及销毁互斥锁#include <pthread.h>//创建锁 要用默认的属性初始化互斥量,只需把attr设置为NULL。int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);

2021-07-31 11:43:25 472

原创 进程与线程的区别,进程与线程的优缺点

进程与线程的区别,进程与线程的优缺点区别:1、进程就是程序执行的一个实例2、进程是资源分配的最小单位3、线程是程序执行的最小单位4、进程有单独的地址空间5、线程没有单独的地址空间线程的优点1、每个进程都要开辟一个空间,而线程是共享数据空间的,所以线程更加的节省资源2、进程的通信比较复杂,需要运用到进程间的通信各种API,而线程是共享数据的,所以线程的数据传递更加的方便。3、线程的运行效率要比进程高...

2021-07-31 10:34:52 2046

原创 多线程的创建,退出及等待

多线程的创建,退出及等待线程创建:int pthread_create(pthread_t * tid, const pthread_attr_t * attr, void * ( * func) (void * ), void * arg);其返回值是一个整数,若创建进程成功返回0,否则,返回其他错误代码,也是正整数。 pthread_t t1; pthread_create(&t1,NULL,act,NULL);第一个参数 t1:创建的线程ID号第三个参数:创建线程的处理函数:(v

2021-07-30 11:09:18 172

原创 进程间的五种通信方式 之实现demo

进程间的五种通信方式的实现代码1、管道(半双工管道) (在父子进程或者兄弟进程间实现通信)半双工管道实现父子进程之间的通信:fd[0] 读 fa[1] 写写的时候就关闭读端,读的时候就关闭写端用 int pipe(int fd[2])函数创建管道#include<stdio.h>#include <unistd.h>#include <stdlib.h>#include <sys/types.h>#include <sys/wa

2021-07-29 11:02:55 399

原创 如何收集子进程的退出状态?fork和vfork的区别

收集子进程的退出状态在这之前我们先来了解 fork函数和vfork函数的区别1、 vfork ()就是能保证子进程先运行,在子进程调用exec 或exit 退出之后父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的做进一步动作,则会导致死锁。2、. fork ():子进程拷贝父进程的数据段,代码段vfork ( ):子进程与父进程共享数据段3、 fork ()父子进程的执行次序不确定vfork 保证子进程先运行,在调用exec 或exit 之前与父进程数据是共享的,在它调

2021-07-28 10:42:13 278

原创 什么是孤儿进程? 什么是僵尸进程?

什么是孤儿进程? 什么是僵尸进程?1、孤儿进程父进程如果不等待子进程退出,在子进程之前就结束了自己的“生命”,此时子进程就叫做孤儿进程。Linux避免系统存在过多孤儿进程,init进程收留孤儿进程,变成孤儿进程的父进程。Pid==1,init进程(初始化进程)2、僵尸进程僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。(也就是子进程的退出状态不被收集)。...

2021-07-28 10:30:55 3423

原创 fopen 与 open的区别

fopen 与 open的区别1、缓冲文件系统与非缓冲系统的区别缓冲文件系统(fopen) :在内存为每个文件开辟一个缓存区,当执行读操作,从磁盘文件将数据读入内存缓冲区,装满后从内存缓冲区依次读取数据。写操作同理。内存缓冲区的大小影响着实际操作外存的次数,缓冲区越大,操作外存的次数越少,执行速度快,效率高。缓冲区大小由机器而定。借助文件结构体指针对文件管理,可读写字符串、格式化数据、二进制数据。非缓冲文件系统(open):依赖操作系统功能对文件读写,不设文件结构体指针,只能读写二进制文

2021-07-27 10:02:10 651

转载 计算结构体的大小

计算结构体的大小我们实际生活中,保存的数据一般不会是同一种类型,所以引入了结构体。而结构体的大小也不是成员类型大小的简单相加。需要考虑到系统在存储结构体变量时的地址对齐问题。由于存储变量地址对齐的问题,结构体大小计算必须满足两条原则:一、结构体成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍)二、结构体大小必须是所有成员大小的整数倍下面来具体分析1、简单结构体struct s1{char ch1;char ch2;int i;};这个结构体的大小容易计算,满足两个原则即可

2021-07-26 10:57:43 90

原创 链表的增删改查

链表的增删改查的简单代码实现此操作是基于动态创建链表的基础上。#include<stdio.h>#include <stdlib.h>struct test{ int data; struct test *next;};void printfLink(struct test *head){ struct test *p=head; while(p!=NULL) { printf("%d",p->data); p=p->

2021-07-25 11:38:26 130

原创 链表的动态创建之尾插法

用尾插法创建动态链表C语言中创建链表需要用到结构体,所以在此之前我们先定义一个结构体。struct test{ int data; struct test *next;};尾插法的原理就是让原本链表的next指向新创建的数据,所以我们需要写一个whlie循环,保证每次都能到达“尾巴”,让数据可以准确的在尾部插入。while(p->next!=NULL){ p=p->next;}p->next=new;总体代码如下#include<stdio.h>

2021-07-25 10:43:28 333 1

原创 自己编写函数实现字符串函数二strchr strstr源码

编程实现字符串函数1、strchrchar *mystrchr(char *str,int c){ while(*str!='\0') { if(*str==c) { return str; } str++; } return NULL;}2、strstr

2021-07-24 11:12:06 240

原创 自己编写函数实现 字符串函数一

自己编程实现字符串函数1、putsvoid myputs(char *str){ while(*str!='\0') { putchar(*str); str++; }}2、getsvoid mygets(char *dest){ if(dest==NULL) { printf("内存非法\n"); return; } while(1) { *dest=getchar(); if(

2021-07-23 10:32:06 680

原创 字符串函数总结二

字符串函数总结1、搜索子字符函数strchr()函数原型char *strchr(const char *str, int c)参数str-- 要被检索的 C 字符串。c-- 在 str 中要搜索的字符。功能在参数str所指向的字符串中搜索第一次出现字符c(一个无符号字符)的位置。返回值返回一个指向该字符串中第一次出现的字符的指针,如果字符串中不包含该字符则返回NULL空指针。 [2]头文件#include <string.h>例子如下#include <std

2021-07-22 10:50:45 56

原创 字符串函数总结一

字符串函数总结一1、输出字符串函数puts()#include <stdio.h>#include <stdlib.h>int main(){ char *str="wo hen shuai"; puts(str); system("pause"); return 0;}2、字符串获取函数gets()#include <stdio.h>#include <stdlib.h>int main(){ char str[12

2021-07-20 11:50:34 77

原创 内存泄漏如何处理

内存泄漏如何处理首先我们应该先了解什么是内存泄漏?1、就是程序刚开始运行的时候都能正常运行,当运行几个小时或者几天之后程序突然崩溃了解决方法:1、查看程序的while循环里面是不是一直在用malloc函数申请空间2、用free函数释放空间...

2021-07-20 10:06:29 87

原创 数组指针 一维数组的遍历

数组指针的遍历本文主要讲以为数组的遍历,因为我在学习数组指针的时候遇到了问题,我用数组指针指向了一个一维数组,结果在遍历的时候不能准确的打印出数组的值,经过查阅资料例子如下:#include <stdio.h>#include <stdlib.h>int main(){ int a[2]={1,3}; int (*p)[2]; int i; p=a; for(i=0;i<2;i++) { printf(" %d ",*(*

2021-07-19 15:35:45 663 1

原创 C语言中数组大小和数组元素个数的计算方法

数组大小和数组元素个数的计算C语言中用sizeof()函数可以计算大小,例子如下#include <stdio.h>#include <stdlib.h>int main(){ int arr[10]={0}; printf("数组的大小是:%d\n",sizeof(arr)); system("pause"); return 0;}运行结果可以看到计算的数组大小是40,因为是整形数组,每个元素的大小是四个字节,一共有十个元素,所以数

2021-07-16 11:04:20 9199 1

原创 简单选择排序法

C语言数组实现简单选择排序法#include <stdio.h>#include <stdlib.h>int main(){ int i; int j; int temp; int data[10]={8,1,2,5,4,3,7,9,0,6}; for(i=0;i<10-1;i++) { for(j=i+1;j<10;j++) { if(data[i]<data[j]) {

2021-07-16 10:05:46 57

原创 C语言 数组 冒泡排序法

C语言 数组 冒泡排序法以从小到大排序为例,冒泡排序的整体思想是这样的:从数组头部开始,不断比较相邻的两个元素的大小,让较大的元素逐渐往后移动(交换两个元素的值),直到数组的末尾。经过第一轮的比较,就可以找到最大的元素,并将它移动到最后一个位置。第一轮结束后,继续第二轮。仍然从数组头部开始比较,让较大的元素逐渐往后移动,直到数组的倒数第二个元素为止。经过第二轮的比较,就可以找到次大的元素,并将它放到倒数第二个位置。以此类推,进行 n-1(n 为数组长度)轮“冒泡”后,就可以将所有的元素都排列好。

2021-07-15 13:08:38 2576

原创 linux下给文件添加可执行权限

linux下给文件添加可执行权限sudo chmod u+x start.shstart.sh: 就是需要加权限的文件

2021-06-27 10:47:07 286

原创 socket UDP TCP IP http https 各自所在的七层网络模型中的哪一层

socket UDP TCP IP http https 各自所在的七层网络模型中的哪一层通常我们所说的网络七层模型就是:七层模型,亦称OSI(Open System Interconnection)。参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系,一般称为OSI参考模型或七层模型。它是一个七层的、抽象的模型体,不仅包括一系列抽象的术语或概念,也包括具体的协议。应用层 http https表示层会话层 socket传输层 TCP UDP网络层

2021-06-20 09:50:40 1592

原创 linux 文件服务站(类似ftp) C语言

linux 文件服务站(类似ftp) C语言服务器#include<stdio.h>#include <unistd.h>#include <stdlib.h>#include <netinet/in.h>#include <arpa/inet.h>#include <sys/types.h> #include <sys/socket.h>#include <string.h&gt

2021-05-30 11:33:00 99

原创 C语言 结构体中使用函数指针

C语言 结构体中使用函数指针#include <stdio.h>struct Animal{//定义结构体 int age; int weight; void (*eat)();//函数指针};void eatdog(){ printf("我尝试一下\n");}int main(int argc, char const *argv[]){ struct Animal cat;//定义结构体变量 cat.eat=eatdog;//给结构体中的函数指针赋值 eatdo

2021-05-30 10:58:28 354

原创 树莓派-内核开发-说明 下载代码 编译 替换内核

树莓派-内核开发-说明 下载代码 编译 替换内核原文地址https://blog.csdn.net/nicekwell/article/details/78482833

2021-05-18 11:52:39 52

原创 1、什么是程序,什么是进程,有什么区别?2、如何查看系统中有哪些进程?3、什么是进程标识符?4、什么叫父进程什么叫子进程?5、c程序的存储空间是如何分配的?

1、什么是程序,什么是进程,有什么区别?程序是一个静态的概念 gcc xxx.c -o gro 磁盘中生成的gro文件叫做程序进程是程序的一次运行活动,也就是说程序运行起来了就是一个进程2、如何查看系统中有哪些进程?用ps -aux指令查看所有进程用ps -aux|grep xxx 来查看我们需要的进程 xxx为查看的进程名还可以使用top指令来查看,类似于windows的任务管理器3、什么是进程标识符?每个进程都有一个非负整数表示的唯一id,叫做pid,类似于身份证。Pid=0 :

2021-03-13 11:28:17 353

原创 linux C语言 配置文件的修改

linux C语言 配置文件的修改首先需要修改的原文件假如是TEST.txtLENG=3SDK=1QWER=19TEST.txt 内容如上假如我要把TEST.txt里面的LENG=3修改为LENG=5,那么应该怎么做呢,代码如下#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include<stdio.h>#include <string.h>

2021-03-11 11:29:28 674

原创 linux 关于 文件 的笔记

linux 文件 open close文件标识符: 0 1 2 int fd标准输入 标准输出 标准错误 自己定义的标识符open 打开文件fd=open(); if(fd==-1){表示打开文件错误}close 关闭文件Creat 创建文件int creat(const char *pathname, mode_t mode);Pathname:要创建的文件名 mode:权限 可读、可写·

2021-03-10 17:25:34 43

原创 linux cp复制函数的源代码

linux C语言 复制函数cp源代码#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include<stdio.h>#include <string.h>#include <unistd.h>#include <stdlib.h>int main(int argc,char **argv){ int fdSr

2021-03-10 17:21:33 468

空空如也

空空如也

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

TA关注的人

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