C语言
C语言
Feiffer_Hu
Android wifi framework工程师、单片机工程师、嵌入式初级驱动工程师、BSP_Sensor驱动工程师
展开
-
4.13、进程与线程
进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握。一篇材料,发现有一个很好的类比,可以把它们解释地清晰易懂:1.计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。2.假定工厂的电力有限,一次只能供给一个车间使用。也就是说,一个车间开工的时候,其他车间都必须停工。背后的含义就是,单个CPU一次只能运行一个任务。3.进程就好比工厂的车间,它代表CPU所能处理的单个任务。任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。4.原创 2020-06-02 14:23:17 · 178 阅读 · 0 评论 -
4.12、进程间通信 -- 信号灯
信号灯集:用于解决多进程/线程的同步互斥的机制,也叫做计数信号灯信号灯(集):多个信号量(灯)的集合,能够用来表示在多进程多线程中表示需要的多种资源的集合死锁:对资源的使用,但是没有释放,导致整个进程没有办法继续执行,导致一种资源的竞争,但是又没办法释放资源一、创建信号灯集int semget(key_t key, int nsems, int semflg);/****************************************************************参数:原创 2020-06-02 14:21:55 · 581 阅读 · 0 评论 -
4.11、进程间通信 -- 消息队列
消息队列:在使用数据进行通信时,如果往某个地址中写入数据时在未被读取前内容不会被覆盖而是直接在原先内容之后再加入新内容组成队列形式就叫做消息队列(链式队列)1、ftok()得到key值key_t ftok(const char *pathname, int proj_id);2、创建消息队列int msgget(key_t key, int msgflg);/*************************************************************..原创 2020-06-02 11:46:04 · 196 阅读 · 0 评论 -
4.10、进程间通信 -- 共享内存
共享内存:可以给各个进程创建一段能够公用的内存空间–ipcs查看各个进程找到ipc对象的空间的方式:通过创建时给定一个唯一的标识,通过这个标识那就只会一个这个标识的ipc对象创建key值(唯一的标识)key_t ftok(const char *pathname, int proj_id);//创建唯一标识通过两个参数方式设置得到,如果通过ftok去创建唯一标识时,参数完全一样创建的 key_t值一样/*****************************************..原创 2020-06-02 11:40:04 · 306 阅读 · 0 评论 -
4.9、进程间通信 -- 信号
信号:它是一种软件层次的中断方式,它是硬件中断的操作系统层次的实现,它的处理机制由系统完成。信号中是一种异步的通信方式(不是同时执行),信号主要用在进程和内核的交互发送信号:kill + (信号) + pid 如果不指定信号时发送的是(SIGTERM)查看信号:kill -l信号的发送int kill(pid_t pid, int sig);//信号的发送函数,指定向某个进程发送信号/***********************************************..原创 2020-06-02 11:30:22 · 204 阅读 · 0 评论 -
4.8、进程间通信 -- 管道
一、无名管道单工:固定一种方向进行通信半双工:方向不定,但是同一时间只能由一端发送到另一端全双工:通信方向都可以,同时可以发送也可以接收1、是一种特殊的文件,只存在内存中,由内核尽心管理2、在这个管道中,提供一个写端,一个读端,让不同的进程可以对这个管道的内容进行读写3、这个管道中读端和写端固定,满足先进先出原则,只要是被读取的内容就会从管道中消失(管道不会保存读取的内容)4、对于管道来说是单工通信,只能在有关系的进程间通信(父子、兄弟进程)5、管道的操作方式和文件一样(read原创 2020-06-02 11:21:50 · 217 阅读 · 0 评论 -
4.7、线程间的同步互斥
线程操作优点:由于由全局变量(共用),可以在各个线程间访问相同空间,线程之间的通信比较方便线程操作的缺点:线程间的同行需要采用同步互斥机制(线程操作随机执行,导致通信空间值的不确定性)线程通信:采用同步互斥方式实现线程间的通信一、同步:多个任务按照一定的先后顺序,协调工作,去执行一件事情(程序的相应代码)用信号量(一个值)去实现同步;由信号量去控制线程是阻塞还是继续执行信号量:代表着一种资源数目,这个值最小为0信号量:1、申请资源//p操作(让线程往下执行)信号量-12、释放资源//v操作原创 2020-06-02 11:08:33 · 200 阅读 · 0 评论 -
4.6、线程相关及函数
线程概念一、编译 gcc xxxx -lpthread二、线程就是用作多任务的处理的方式1、在进程中资源都是独立的,系统在切换进程时开销很大(通过task_struct的结构体链表管理)2、内核会为每个进程都创建task_struct,每个进程都独立的参与内核调度,相互没有干扰3、 由上所诉,在linux中引入了一种轻量级进程(线程),在lnux中不太区分进程、线程;线程之间会共享一部分系统资源,在同一进程中,线程共享着空间地址,线程依附于进程的执行,进程执行后才会有线原创 2020-06-02 10:51:58 · 270 阅读 · 0 评论 -
4.5、进程相关
进程:程序执行时,所需要的资源的集合总称程序的一次执行过程程序:一些指令的集合,存在在磁盘空间中,是静态的进程:动态的执行过程(创建、调度、执行、消亡),指令的执行过程程序包含:1、用户数据段2、正文段进程包含的内容:1、用户数据段:存放的是全局变量、常数以及动态数据分配的数据空间2、正文段:存放的是程序中的代码3、系统数据段系统数据段包含:1、进程控制块2、cpu中pc寄存器3、堆栈进程控制块PCB1、进程号 pid(在系统中进程的唯一识别)2、进程优先级、状态3、进程原创 2020-05-29 11:26:43 · 185 阅读 · 0 评论 -
4.4、多任务与进程线程
为了实现计算机多任务的处理方式进程线程是由操作系统进行调度多任务:在同一时刻有多个任务在同时运行一个程序在运行时要独占CPU的资源,而多任务的处理机制源于CPU的高速轮转进程谁先被执行,是不确定的,取决于内核中一段程序(调度器)多进程:当一个程序运行起来之后,是独立的进程,一个大型程序要处理的事务非常的繁重,解决方案则是将该进程变成多个进程去处理一些繁重的事务运行一个程序之前,会产生一个会话,进程依赖于会话,如果该进程有子进程,则该进程为进程组的组长(父进程默认是进程组的组长)多进程程序,进原创 2020-05-28 18:07:24 · 193 阅读 · 0 评论 -
4.3、目录和文件属性
int remove(const char *pathname);//删除一个文件参数:指定要删除的文件的路径int rename(const char *oldpath, const char *newpath);//重新设置文件的名字参数:1、oldpath:要修改文件名的路径2、newpath:要修改之后的文件名的路径...原创 2020-05-28 18:01:17 · 347 阅读 · 0 评论 -
4.2、文件IO操作
* 文件指针偏移--缺陷:long在最大±2G,数据最大偏移2G1. int fseek(FILE *stream, long offset, int whence)://重新设置文件指针位置stream将指向以fromwhere为基准,偏移offset(指针偏移量)个字节的位置。如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置。参数:stream–偏移的文件流指针 offset–指针偏移量–以whence为基准偏移offset个字节的位置 whence–偏移原创 2020-05-28 17:28:20 · 303 阅读 · 0 评论 -
4.1、标准IO
IO:是一种简单的输入输出IO是相对于计算机来说的,提供一种和用户交流的方式Linux平台io只会操作一个内容 ---- 文件ulimit -a 查看系统允许最大操作上限文件类型:普通文件 — 字符文件、二进制文件目录文件 (… . )索引符号链接文件管道文件(进程学习)设备文件(驱动开发学习) — 字符设备文件、块设备文件套接字文件(网络编程)标准io —效率高系统调用:内核向用户层提供的一个接口(API ),让用户层能访问到内核所管..原创 2020-05-28 17:27:29 · 198 阅读 · 0 评论 -
3.5、树
树状图是一种数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:每个结点有零个或多个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除了根结点外,每个子结点可以分为多个不相交的子树;树(tree)是包含n(n>=0)个结点的有穷集,其中:(1)每个元素称为结点(node);(2)有一个特定的结点被称为根结点或树根(root)。(3)除根结点之外的其余数据元原创 2020-05-28 17:25:31 · 206 阅读 · 0 评论 -
3.4、队列简介及模拟操作
队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列是一种先进先出(First in First Out)的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头。顺序队列建立顺序队列结构必须为其静态分配或动态申请一片连续的存储空间,并设置两个指针进行管理。一个是队头指针front,它指向队头元素;另一个是队尾指针rear,它指向下一个入队元素的存储位置,如图所示每次在队尾插入一个元素是,rear增1;每次在队头删除一个元素时,front增1。随着插入和删原创 2020-05-28 17:24:35 · 331 阅读 · 0 评论 -
3.3、堆栈
栈:先进后出堆:先进先出栈(stack):先进后出 pop(弹栈) push(压栈)顺序栈链式栈示例代码/****************************************************************** Copyright (C) 2018 Sangfor Ltd. All rights reserved.* * 文件名称:stack.c* 创 建 者:yinfei-hu* 创建日期:2018年8月22日 星期3 14时原创 2020-05-28 17:22:05 · 172 阅读 · 0 评论 -
4.1、标准IO
IO:是一种简单的输入输出IO是相对于计算机来说的,提供一种和用户交流的方式Linux平台io只会操作一个内容 ---- 文件ulimit -a 查看系统允许最大操作上限文件类型:普通文件 — 字符文件、二进制文件目录文件 (… . )索引符号链接文件管道文件(进程学习)设备文件(驱动开发学习) — 字符设备文件、块设备文件套接字文件(网络编程)标准io —效率高系统调用:内核向用户层提供的一个接口(API ),让用户层能访问到内核所管..原创 2020-05-28 17:19:04 · 214 阅读 · 0 评论 -
3.2、双链表
一、循环链表循环链表中第一个节点之前就是最后一个节点,反之亦然。循环链表的无边界使得在这样的链表上设计算法会比普通链表更加容易。二、有头循环双链表双向链表中不仅有指向后一个节点的指针,还有指向前一个节点的指针。起始的时候第一个节点的”前连接”指向自己,”后连接”指向自己;非空的时候第一个节点的”前连接”指向自己最后一个节点,最后一个节点的”后连接”指向第一个节点。这样可以从任何一个节点访问前一个节点,也可以访问后一个节点,以至整个链表。一般是在需要大批量的另外储存数据在链表中的位置的时候用。typ原创 2020-05-25 10:34:27 · 711 阅读 · 0 评论 -
3.1、链表--单链表
一、线性表1、顺序存储—数组2、链式存储—链表单链表 (有头、无头)(循环、不循环)双链表 (有头、无头)(循环、不循环)3、队列:循环队列4、栈:5、树:二叉树……6、图二、删除内存是将链接或者标记符号(在使用是1、空闲是0)从1到0三、有头循环链表头节点插入四、有头循环链表尾节点插入...原创 2020-05-25 10:04:19 · 351 阅读 · 0 评论 -
2.16、指针与其他项
常量const与指针1、常量指针:是一个指针,指针指向一块常量空间 const int p or int const p;指针的指向可以更改,指针指向的空间的值不能修改2、指针常量:是一个常量,常量不能修改其值 int *const p;指针的指向不能更改,指针指向的空间的值可以更改3、常量指针常量:既是一个指针,也是一个常量 const int *const p;指针的指向不能更改,指针指向的空间的值也不能更改数组与指针int arr[2][3] = {{1,2,3},{4,原创 2020-05-24 17:21:23 · 150 阅读 · 0 评论 -
2.15、Makefile简介
makefile 工程管理器规则文件:描述编译过程。 makefile Makefile目标:依赖由依赖生成目标的规则伪目标:不需要依赖的目标变量变量定义的两种方式 自定义变量:1、递归展开方式VAR=var2、简单方式 VAR:=var3、VAR?=var 变量若存在则不做任何操作。变量名+= 值 表示在变量的末尾追加值自动变量$* 不包含扩展名的目标文件名称$+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件$< 第一原创 2020-05-24 17:18:21 · 427 阅读 · 0 评论 -
2.14、堆
堆区动态内存分配1、堆的特性:需要手动开辟和释放空间。堆区内存 — 生命周期:从你申请开始到释放或者程序结束而结束作用域:得到的指针范围2、使用: 必须先申请才能使用申请: 头文件 :#include <stdlib.h>函数: malloc函数五要素:1).作用:申请堆区内存2).函数原型: void *malloc(size_t size);3).参数: size :表示要申请的堆区内存的大小,字节。4).返回值:void *:万能指针,成功返回–指针指向一.原创 2020-05-24 17:16:47 · 135 阅读 · 0 评论 -
2.13、共用体与字节序
共用体: 跟结构体类似,存储空间共用。空间的大小由最大的成员决定。定义共用体类型:union 共用体类型名{成员1;成员2;…};共用体使用:结构体简介跟结构体完全一致;字节序:对于多字节数据,超过一个字节的基本数据类型1、大端:数据高位存放在内存的高地址,地位在低地址 ----PC机 AMD x86架构2、小端:数据高位存放在内存的低地址,地位在高地址 ----ARM 架构由CPU架构决定,风扇区别。...原创 2020-05-24 17:12:33 · 338 阅读 · 1 评论 -
2.12、结构体与指针
结构体自定义一个数据类型(构造类型);一种构造数据类型由一个或多个基本数据类型构造而成的数据类型1、定义一个结构体类型:struct 结构类型名 {成员1;成员2;…};2、定义一个结构体类型变量:struct 结构类型名{成员1;成员2;…}结构体变量名;3、给类型取别名:typedef 原类型名 别名;4、初始化:struct 结构类型名{成员1;成员2;…}结构体变量名 = {成员1的值,成员2的值,…};5、使用:结构体不能整体使用,必须进入原创 2020-05-24 17:06:21 · 486 阅读 · 1 评论 -
2.11、函数指针数组
函数指针数组本质是数组,数组元素是指针,指针指向函数;eg: void (int)定义:返回值数据类型 (*指针数组名 [])(形式参数列表);void (*fpa [])(int);原创 2020-05-24 16:56:02 · 90 阅读 · 0 评论 -
2.10、函数与指针
函数的定义结构: 返回值数据类型 函数名称(形式参数列表){函数体,函数功能实现部分}指针函数: 返回值是指针类型的函数;函数的声明返回值数据类型 函数名称(形式参数列表);函数的调用函数名称(实际参数列表);参数的传递1)、复制实参传递int func(int a,int b);func(x,y);2)、实参地址方式传递int func(int *a,int *b);func( &x , &y );函数指针1、本质:一个指针,指向一个原创 2020-05-24 16:52:23 · 114 阅读 · 0 评论 -
2.9、数组指针与二维数组
移动的字节单位 = n * 数据类型(*p)字节单位;指针与常量进行算数运算后,仍然是一个指针;分级一个 * 为一级,一个 []一级升级取&升级int b是一个元素,&b就是一个一级指针)降级1、使用时和[]降级int b[3];b是一级指针,b[0]是元素2、定义时和[]升级int b是一个元素,int *b是一个b是一个一级指针,int b[10]的b是一个一级指针或者是一维数组指针与二维数组int arr[2][3] = {{1,2,3},{4,5,6}};原创 2020-05-24 16:43:10 · 1094 阅读 · 0 评论 -
2.8、字符数组与字符串
字符数组char str[] = {'h','e','l','l','o'}; //在栈的连续内存空间 char str2[] = "hello"; //在栈的连续内存空间 char *str3 = "hello"; //在文本常量区的连续内存空间,文本常量区是一块只读的内存空间 str[0] = 'a'; str2[0] = 'a';原创 2020-05-24 16:30:39 · 239 阅读 · 0 评论 -
2.7、指针简介
void * 指针不能做取值操作内存地址:0x0:默认不分配给任意进程使用,不可读不可写-----NULL指针变量一个空间,存放的是内存地址。 ----32位 4字节----64位 8字节指针变量:保存地址值 -》十六进制数指针=地址指针:type name = value;指针的type在规定指针取值时按照多大的数据和按照什么样的存储方式来进行对内存中值获取在64位机上任意类型的指针都占用8字节指针变量有自己独立内存空间,该内存中可以存放是一个十六进制数----该十六进制原创 2020-05-24 16:25:37 · 590 阅读 · 0 评论 -
2.6、变量
变量:对存储空间的抽象,内存空间命名数据类型:int char double float本质:空间的大小,空间的使用方式存储方式:1、全局变量:整个文件及文件外都可以使用-----作用域从程序开始到结束,变量空间一直有效-----生命周期存储位置-----静态区2、局部变量:当前代码块-----作用域从代码块开始到结束-----生命周期栈-----静态区3、静态变量:static修饰的局部变量:静态局部变量从程序开始到结束,变量空间一直有效-----作用域存储位置-原创 2020-05-24 16:16:05 · 131 阅读 · 0 评论 -
2.5、GCC与GDB编译过程及错误分析
gcc 组件(1)分析器:分析语法结构,将C语言编译汇编语言。.s(2)汇编器:将汇编代码编译成二进制文件(3)链接器:链接目标文件以及库文件,生成可执行代码。(4)标准C库:提供核心的C库函数。scanf printfgcc编译过程(1)预处理: 宏替换和头文件展开.c - > .i 。gcc -E test.c -o test.i(2)编译: 将经过预处理后的文件.i,编译成汇编文件.sgcc -S test.i -o test.s(3)汇编: 将汇.原创 2020-05-24 16:10:39 · 728 阅读 · 0 评论 -
1.15、C语言设计简易五子棋
实现一个20*20的简易五子棋,双方使用键盘输入落子的坐标,刷新输出当前棋局状态,并且判断有无五子连心,裁决输赢。/****************************************************************** Copyright (C) 2018 Sangfor Ltd. All rights reserved.* * 文件名称:wuziqi.c* 创 建 者:yinfei-hu* 创建日期:2018年08月07日 星期2 14时39原创 2020-05-24 15:28:01 · 553 阅读 · 0 评论 -
1.12、C语言设计简易扫雷
/****************************************************************** Copyright (C) 2018 Sangfor Ltd. All rights reserved.* * 文件名称:saolei.c* 创 建 者:yinfei-hu* 创建日期:2018年08月07日 星期2 14时21分02秒* 功能描述:10*10扫雷***********************************原创 2020-05-24 15:22:54 · 250 阅读 · 0 评论 -
1.13、C语言基本函数
字符串处理函数1、strlen:计算字符串长度,不包括’\0’#include<string.h>原型:size_t strlen(const char *s);参数:字符串常量或者是存放字符串的数组的数组名返回:字符串长度2、strcpy:字符串拷贝函数 注意:连’\0’一起拷贝#include<string.h>原型:char *strcpy(char *dest, const char *src); char str[] strcpy(char de原创 2020-05-24 15:21:14 · 181 阅读 · 0 评论 -
1.12、C语言二维数组
二维数组语法: 存储类型 数据类型 数组名[一维长度][二维长度]数组名[行][列]二维数组在本质上,是一个一维数组的列表。数值二维数组int a[3][4];列 0列 1列 2列 3行0a[0][0]a[0][1]a[0][2]a[0][3]行1a[1][0]a[1][1]a[1][2]a[1][3]行2a[2][0]a[2][1]a[2][2]a[2][3]a[i][j] i–行 j–列注意:二维数组在内存中是原创 2020-05-24 15:14:10 · 327 阅读 · 0 评论 -
1.11、C语言数组
数组概念:具有相同数据类型元素的集合,存储是固定大小特点:1.数据类型相同 2.内存连续一维数组1、定义:存储类型 数据类型 数组名[下标]; //下标–数组的长度,元素的个数一个数组所占的内存空间是所有元素占内存空间的总和2、定义并初始化int a[10];//定义10个int数据的集合int b[5] = {1, 2, 3, 4, 5}; //定义并初始化int arr[5] = {1, 2}; //定义并部分初始化int arr1[5] = {0原创 2020-05-24 15:06:40 · 324 阅读 · 0 评论 -
1.10、C语言循环语句
循环语句:允许我们多次执行一个语句或语句块 — for循环、while循环、do…while循环for循环for(初始表达式1;判断表达式2; 控制表达式3){ //条件成立执行的内容; } 初始表达式1:循环控制变量; 首先被执行,且只执行一次 判断表达式2:循环的条件,如果判断表达式为真,则执行循环体的内容 控制表达式3:控制循环条件,指向循环的结束允许在初始表达式定义控制变量表达式2允许进行复杂的表达式判断允许表达式1,表达式3缺少,在表达式3缺少原创 2020-05-24 14:54:20 · 1116 阅读 · 0 评论 -
1.9、C语言选择语句
if语句:1、表示判断: if(条件表达式){ 如果条件表达式成立执行的内容 }2、二分枝选择 if(条件表达式) { 如果条件表达式成立执行的内容 } else { 如果条件表达式不成立执行的内容 }3、阶梯结构 if(条件表达式1){ 如果条件表达式1成立执行的内容 } else if(条件表达式2) { 如果条件表达式2成立执行的内容原创 2020-05-24 14:36:08 · 1019 阅读 · 0 评论 -
1.8、C语言输入输出函数及其使用
字符输出函数函数原型:int putchar(int c); 功能:把字符c输出到终端参数c:c为字符常量、变量、表达式返回值:正常,成功输出字符的ASCII码值失败:EOF字符输入函数函数原型:int getchar(void); 功能:从终端获取字符参数:void为空返回值:正常,成功获取字符的ASCII码值失败:EOF -1getchar、putchar 都是单个字符的操作getchar获取时只获取一个字符putchar输出为字符形式,不带换行格式化输出函数函数原原创 2020-05-24 14:24:31 · 1104 阅读 · 0 评论 -
1.7、C语言基本运算符
算术运算符:+ - * / % ++ –++、–在前,先自加/直减 然后参与运算++、–在后,先参与运算 然后自加/直减如果++、–单独为一行代码的时候,不考虑上述问题关系运算符:< > <= >= == !=用于做多个数据之间的比较,数据之间的比较结果只可能是0(false)或1(true)特殊运算符三目运算符: 表达式?当表达式成立返回的内容:当表达式不成立返回的内容逻辑运算符: && 与 、 || 或 、 ! 非用于连接多原创 2020-05-24 14:08:55 · 358 阅读 · 0 评论