Linux和C语言的学习方法你真的知道吗?
★Linux的使用
第一天,就给我们讲了为什么要先学c、学linux:因为嵌入式的根本就是软件驱动硬件,而C语言是最接近硬件的语言、有指针的概念、可以直接操作硬件,另外,功能复杂的硬件是含有操作系统的,这就需要我们选择使用广泛而开源的linux来学习。
◇Shell 命令
shell是一个命令行解释器,命令行格式为:命令名称、选项、参数,常用的命令有:cd进入目录;ls显示目录下的文件;touch、mkdir创建文件、文件夹;mv、cp、rm移动、复制、删除文件和文件夹;zip、gzip、tar压缩和解压文件;ln创建软硬链接文件。
◇文件管理、用户管理
Linux是一个多用户系统,它可以用adduser来创建多个用户,并用su来进行不同用户及用户与管理员之间的切换;另外,与目录结构属于分区的windows不同,在Linux的文件系统中,分区属于目录结构。
◇软件管理
ubuntu上的软件包管理工具apt可以通过网络很方便地完成软件包的获取、安装、卸载、查询等操作。比如,当我们在使用putty前需要安装SSH的时候,就可以通过命令:sudo apt-get update、sudo apt-get install SSH 来安装。
◇VI 编辑器,GCC 编译器
Vi是Linux系统中常用的一个文本编辑器,通过vi加上文件名可以对文件创建或编辑。三种模式中:命令模式是我们进入编辑器的第一模式,可以对文本进行剪切复制替换删除操作;输入模式可以是对文件进行常规编辑;底行模式可以保存文本并退出。vi编辑好的c文件需要被编译二进制文件才可以被机器识别运行,而GCC 编译器就承载着这样的功能,它通过预处理、编译、汇编、链接四个步骤完成该操作。
★C语言编程
C语言学习的开始就是掌握基本的语法规则,主要包括各种基本类型常量变量、运算符、控制流、函数的使用。这部分总的来说没有什么难度,但有一些容易忽略的细节需要留意,如同为单目运算的*解引用和++操作同时使用时哪个优先运算;数组被定义后其空间大小和首地址不允许改变;要用strcmp()判断字符串相等而不能直接用==;指针定义后但没初始化会变成野指针,后续使用可能发生段错误;使用较大的数据时应在堆中开辟空间存放以防栈溢出。
☆数据结构
数据结构就是对数据进行人为的格式化规范化储存,使得数据能够快捷地增删查改,不同的数据结构有不同的优缺点及主要用途,如顺序表查找快增删慢而链表查找满增删快。鉴于内核链表的重要性及以后使用的广泛性,在此只做内核链表的总结。内核链表和双向循环链表类似,与之不同的是,内核链表将数据和链表剥离开,并提供了很多的宏和封装函数。其中非常重要的是list_for_each()、list_entry(),它们分别实现了对小结构体(循环链表)的遍历操作、通过小结构体的地址反推找到大结构体的地址,从而通过大结构体得到其下的数据域。另外还有list_add()、list_del_init()封装实现了对大结构体节点的插入、孤立删除,不然自己搭建双向循环链表的话,就需在头插node节点时要写上经典的四句指针域重连接指令:①node->next = head->next;②head->next->pre = node;③node->pre = head;④head->next = node;
☆文件IO
这里的iO指的是内存和磁盘间的文件交互,由于linux“一切皆文件的”的特性,其7种类型的文件都是可以被输入输出的。其间我们重点学习了文件IO和标准IO,他们的主要区别就是前者直接调用系统函数没有缓冲区,而后者调用的是封装好的库函数有缓冲区。一般来说,文件IO是专门给文件使用的,而标准IO是专门给设备使用的。文件、标准io的打开和关闭所用的函数是相似的,只是一个有f一个没f;但他们的读写函数差别就比较大了,文件io用的是read()、write(),而标准IO根据输入输出是否格式化分为printf、put、scanf、get,具体还会根据一字一行一块地读写及读写目标地的不同而有所不同。另外还了解了下利用time()、ctime()来获取标准时间并转化为可阅读化时间的时间编程,以及通过lstat()、opendir()、readdir()来查看目录下的文件属性。最后介绍了动静态库的概念及制作,前者在文件运行时才加载到可执行文件中,而后者在编译时即完成,至于二者制作步骤的话比较复杂,需要用到的时候再对照着笔记制作好了。
☆进程线程
这部分我想是重中之重,毕竟进程线程出现的一大动机就跟人类的无限欲望相关联:想要在越短的时间做越多的事情。进程就是执行中的程序,但与只包含指令和数据的程序不同,进程有属于自己的地址空间,里面不仅含有指令段数据段,还有动态的堆栈段,因此多个进程可以实现了同一时间做多个任务。进程通过fork()函数创建,对应的PCB由内核创建并保存在内核空间。尽管多核芯片的出现可以让多个进程真的在同时执行任务,但不是所有进程都同时处于运行状态的,更多的进程是在极小的时间片段下轮流替换着来工作,至于替换的顺序是由cpu调度机制决定的,我们无法确定,这也是为什么进程拥有异步特性的原因。未在运行状态的进程往往处于队列就绪等待状态或休眠状态,其它具体的状态可以通过命令ps -aux查看。此外,运行中的进程还分为前台运行和后台运行,如果进程是后台运行的话,就不能对它进行前台操作,如不能对它ctrl + c暂停,这时候可以通过fg指令把它转变为前台运行或直接用kill指令终止进程。被创建后的进程是有生命周期的,它不但可以exit()自行终止进程,还可以用exec函数族中途改为执行新的进程,殊途同归,进程最后都是要终止的,终止后的进程的PCB需要被其父进程wait()回收,中间有差错的话就可能导致孤儿进程或僵尸进程的出现。
当需要进程不受干扰地一直在后台运行、周期性地等待或者执行某一个任务的时候,可以将它设置为守护进程。守护进程不与任何终端关联,即使终端关闭了也还是会照常运行,老师教的7步创建法得记熟。值得注意的是,因为守护进程无法往标准输出打印,中间出错了也没人知道,所以得找个地方储存它的运行情况,因此系统日志应运而生。系统日志可以通过命令cat /var/log/syslog查看。
进程可以通过无名管道、有名管道、信号、共享内存、消息队列、信号量来进行进程间通信,这些通信方式都是在内核中得以实现的。具体的函数及使用笔记上都有详细记录,就不再赘述了。值得留意的是无名有名管道、消息队列中的同一数据是读了一次就没有了的,而共享内存中的同一数据可以被多次读取。
进程和线程都是为了实现计算机的并发功能,但是进程的创建消亡,及进程间的切换都很耗费资源,每次切换进程都要进程上下文切换。线程的优势是多个线程共享指令和全局变量,这就减少了资源管理的消耗,从而更专注于任务的执行。但有优点就有缺点,资源的共享可能会致使多个线程同时对临界资源进行操作,从而导致运算结果的不准确。为了解决这一问题,出现了线程的互斥与同步。线程互斥利用mutex锁在临界区的前后分别pthread_mutex_lock()上锁和pthread_mutex_destroy()解锁,实现同一时间只允许一个线程操作临界资源。线程的同步用的是信号量,相当于加上了数量的线程的互斥,通过合理地使用p+1、v-1操作使得多个线程按一定次序运行。
相关文章:
Linux和C语言的学习方法你真的知道吗?
★Linux的使用 第一天,就给我们讲了为什么要先学c、学linux:因为嵌入式的根本就是软件驱动硬件,而C语言是最接近硬件的语言、有指针的概念、可以直接操作硬件,另外,功能复杂的硬件是含有操作系统的,这就需…...
代码随想录day42
1049. 最后一块石头的重量 II https://leetcode.cn/problems/last-stone-weight-ii/ 这个自己还是没想出来01背包对应。 本题其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了。 stones [2,7,4,1,8,1]也就是sum…...
【笔记】两台1200PLC进行S7 通信(1)
使用两台1200系列PLC进行S7通信(入门) 文章目录 目录 文章目录 前言 一、通信 1.概念 2.PLC通信 1.串口 2.网口 …...
统一网关Gateway
为什么需要网关 网关功能: 身份认证和权限校验服务路由,负载均衡 根据请求判断找到对应的服务路由,然后服务可能有多个实例,这个时候网关就会做一个负载均衡去挑选一个实例调用.请求限流 限制请求的数量,这是微服务的…...
6、kubernetes(k8s)安装
本文内容以语雀为准 文档 等等,Docker 被 Kubernetes 弃用了?容器运行时端口和协议kubeadm initkubeadm config安装网络策略驱动使用 kubeadm 创建集群 控制平面节点隔离 持久卷为容器设置环境变量在CentOS上安装Docker引擎Pod 网络无法访问排查处理 说明 本文…...
python-批量下载某短视频平台音视频标题、评论、点赞数
python-批量下载某短视频平台音视频标题、评论数、点赞数前言一、获取单个视频信息1、获取视频 url2、发送请求3、数据解析二、批量获取数据1、批量导入地址2、批量导出excel文件3、批量存入mysql数据库三、完整代码前言 1、Cookie中文名称为小型文本文件,指某些网…...
【数据结构与算法】单链表的增删查改(附源码)
这么可爱的猫猫不值得点个赞吗😽😻 目录 一.链表的概念和结构 二.单链表的逻辑结构和物理结构 1.逻辑结构 2.物理结构 三.结构体的定义 四.增加 1.尾插 SListpushback 2.头插 SListpushfront 五.删除 1.尾删 SListpopback 2.头删 SListpo…...
华为OD机试 - 回文字符串
题目描述 如果一个字符串正读和反渎都一样(大小写敏感),则称它为一个「回文串」,例如: leVel是一个「回文串」,因为它的正读和反读都是leVel;同理a也是「回文串」art不是一个「回文串」,因为它的反读tra与正读不同Level不是一个「回文串」,因为它的反读leveL与正读不…...
C语言太简单?这14道C语言谜题,你能答对几个
14个C语言的迷题以及答案,代码应该是足够清楚的,而且有相当的一些例子可能是我们日常工作可能会见得到的。通过这些迷题,希望你能更了解C语言。 如果你不看答案,不知道是否有把握回答各个谜题?让我们来试试。 下面的…...
Benchmark测试——fio——源码分析
1. main 1.1 parse_options() 解析选项,更新数据结构 1.1.1 fio_init_options() 1.1.2 fio_test_cconv(&def_thread.o) <cconv.c> 1.1.2.1 convert_thread_options_to_cpu() 传递options给数据结构 1.1.3 parse_cmd_line() switch语句多路选择&am…...
测量 R 代码运行时间的 5 种方法
简介 平常在撰写论文时,会需要比较算法之间的计算时间。本篇文章给出几种测量 R 代码运行时间的方法。本文是小编学习过程中的笔记,主要参考博客1,2。 1. 使用 Sys.time() 小编通常使用 Sys.time() 函数来计算时间。首先记录当前运行时刻&…...
Qt 第9课、计算器中缀转后缀算法
计算器核心算法: 1、将中缀表达式进行数字和运算符的分离 2、将中缀表达式转换成后缀表达式 3、通过后缀表达式计算最后的结果 二、计算器中缀转后缀算法 计算器中缀转后缀算法的意义在于把中缀表达式转换成后缀表达式,能够更好地计算 算法的基本思路…...
docker的使用方法
docker技术 同一个操作系统内跑多套不同版本依赖的业务 docker可以使同一个物理机中进程空间,网络空间,文件系统空间相互隔绝 虚拟机弊端:每个需要安装操作系统,太重量级,资源需要提前分配好 部署程序 开发环境 win…...
Kafka(五)生产者向发送消息的执行流程
(1)生产者要往 Kafka 发送消息时,需要创建 ProducerRecoder,代码如下: ProducerRecord<String,String> record new ProducerRecoder<>("CostomerCountry","Precision Products","France&q…...
华为OD机试模拟题 用 C++ 实现 - 简易压缩算法(2023.Q1)
最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 最多获得的短信条数(2023.Q1)) 文章目录 最近更新的博客使用说明简易压缩算法题目输入输出示例一输入输出说明示例二输入输出说明示例三输入输出说明...
MATLAB R2022b 安装教程
MATLAB R2022b 安装教程MathWorks 于2022年9月发布了 MATLAB 和 Simulink 产品系列的最新版本 Matlab R2022b版本 ,加入两个新产品: Medical Imaging Toolbox — 可视化、配准、分割和标注二维及三维医学图像Simscape Battery — 设计和仿真电池和储能系…...
PCI子系统
很多网络接口卡都是外围组件互联(Peripheral Compaonent Interconnect)设备,必须与Linux PCI子系统协同工作,并非所有的网络接口都是PCI设备,很多嵌入式设备的网络接口连接的就不是PCI总线,这些设备的初始化…...
Spring源码之IoC容器的Bean创建和依赖注入,DefaultListableBeanFactory容器为例
接上篇Spring源码之IoC容器初始化过程,以FileSystemXmlApplicationContext容器为例 因为FileSystemXmlApplicationContext使用的容器为DefaultListableBeanFactory,所以该篇基于DefaultListableBeanFactory的实现分析依赖注入过程。 目录获取Bean的总体流…...
解决小程序页面scroll-view块自身滑动问题
修改scroll-view的style样式 本来通过函数限制高度 style"margin-top:200rpx;"height: calc(100vh - 200rpx - env(safe-area-inset-bottom));会出现整个scroll-view块位置不固定滑动里面的内容后,自己本身在整个页面内上移,将样式改为&#…...
PowerCommand康明斯发电机控制屏维修HMI211
康明斯柴油发电机的监控系统分为普通机组控制屏和智能化机组控制界面。普通操作界面实用于普通的康明斯柴油发电机的控制,康明斯柴油发电机的起动与停止、供电与断电、状态调整等均由手动操作;自动化康明斯柴油发电机控制系统适合于智能化康明斯柴油发电…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...
恶补电源:1.电桥
一、元器件的选择 搜索并选择电桥,再multisim中选择FWB,就有各种型号的电桥: 电桥是用来干嘛的呢? 它是一个由四个二极管搭成的“桥梁”形状的电路,用来把交流电(AC)变成直流电(DC)。…...
