当前位置: 首页 > news >正文

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() 解析选项&#xff0c;更新数据结构 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 种方法

简介 平常在撰写论文时&#xff0c;会需要比较算法之间的计算时间。本篇文章给出几种测量 R 代码运行时间的方法。本文是小编学习过程中的笔记&#xff0c;主要参考博客1&#xff0c;2。 1. 使用 Sys.time() 小编通常使用 Sys.time() 函数来计算时间。首先记录当前运行时刻&…...

Qt 第9课、计算器中缀转后缀算法

计算器核心算法&#xff1a; 1、将中缀表达式进行数字和运算符的分离 2、将中缀表达式转换成后缀表达式 3、通过后缀表达式计算最后的结果 二、计算器中缀转后缀算法 计算器中缀转后缀算法的意义在于把中缀表达式转换成后缀表达式&#xff0c;能够更好地计算 算法的基本思路…...

docker的使用方法

docker技术 同一个操作系统内跑多套不同版本依赖的业务 docker可以使同一个物理机中进程空间&#xff0c;网络空间&#xff0c;文件系统空间相互隔绝 虚拟机弊端&#xff1a;每个需要安装操作系统&#xff0c;太重量级&#xff0c;资源需要提前分配好 部署程序 开发环境 win…...

Kafka(五)生产者向发送消息的执行流程

&#xff08;1&#xff09;生产者要往 Kafka 发送消息时&#xff0c;需要创建 ProducerRecoder,代码如下&#xff1a; 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版本 &#xff0c;加入两个新产品&#xff1a; Medical Imaging Toolbox — 可视化、配准、分割和标注二维及三维医学图像Simscape Battery — 设计和仿真电池和储能系…...

PCI子系统

很多网络接口卡都是外围组件互联&#xff08;Peripheral Compaonent Interconnect&#xff09;设备&#xff0c;必须与Linux PCI子系统协同工作&#xff0c;并非所有的网络接口都是PCI设备&#xff0c;很多嵌入式设备的网络接口连接的就不是PCI总线&#xff0c;这些设备的初始化…...

Spring源码之IoC容器的Bean创建和依赖注入,DefaultListableBeanFactory容器为例

接上篇Spring源码之IoC容器初始化过程&#xff0c;以FileSystemXmlApplicationContext容器为例 因为FileSystemXmlApplicationContext使用的容器为DefaultListableBeanFactory&#xff0c;所以该篇基于DefaultListableBeanFactory的实现分析依赖注入过程。 目录获取Bean的总体流…...

解决小程序页面scroll-view块自身滑动问题

修改scroll-view的style样式 本来通过函数限制高度 style"margin-top:200rpx;"height: calc(100vh - 200rpx - env(safe-area-inset-bottom));会出现整个scroll-view块位置不固定滑动里面的内容后&#xff0c;自己本身在整个页面内上移&#xff0c;将样式改为&#…...

PowerCommand康明斯发电机控制屏维修HMI211

康明斯柴油发电机的监控系统分为普通机组控制屏和智能化机组控制界面。普通操作界面实用于普通的康明斯柴油发电机的控制&#xff0c;康明斯柴油发电机的起动与停止、供电与断电、状态调整等均由手动操作&#xff1b;自动化康明斯柴油发电机控制系统适合于智能化康明斯柴油发电…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

C++_哈希表

本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、基础概念 1. 哈希核心思想&#xff1a; 哈希函数的作用&#xff1a;通过此函数建立一个Key与存储位置之间的映射关系。理想目标&#xff1a;实现…...