Linux和C语言的学习方法你真的知道吗?

news/2024/3/29 9:34:26/文章来源:https://blog.csdn.net/weixin_44059661/article/details/129245722

★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操作使得多个线程按一定次序运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_74918.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idea远程调试线上jar包

有时候本地代码没问题但在线上运行会报错,这时候可以使用idea的remote功能调试线上jar包 步骤1 步骤2:新建remote 步骤3:配置服务器ip和端口 并复制生成的JVM参数供之后使用 步骤4:打jar包,并将生成的jar包放到服务…

Uncaught ReferenceError: jQuery is not defined

今天在拉取项目部署到本地的时候遇到了一个问题特此记录一下 (以后闭坑) 我和同事同时拉取了一样的代码,结果同事的页面加载正常而我的页面像被狗啃了一样,知道是js的问题但是不知道问题出在哪里?后来还是同事帮我解决…

栈与队列小结

一、理论基础1.队列是先进先出,栈是先进后出2.栈和队列是STL(C标准库)里面的两个数据结构。栈提供push和pop等等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不提供迭代器。3.栈是以底层容器…

CRM客户管理系统哪个好用?盘点前十名!

CRM客户管理系统排行?盘点前十名! CRM客户管理系统是一种集成多种功能的软件系统,可以帮助企业跟进和管理客户关系、提高销售业绩、优化营销策略等。对于企业来说,选择一款适合自己的CRM系统非常重要,因为它能够直接影…

python之web自动化测试框架

梳理下搭建web自动化框架的流程: 创建目录: cases:存放测试用例,unittest框架要求用例名必须以test开头,所以命名test_case.py test_case.py代码如下:继承unittest.TestCase类下面的方法setupclass(),te…

学习 Python 之 Pygame 开发魂斗罗(六)

学习 Python 之 Pygame 开发魂斗罗(六)继续编写魂斗罗1. 创建碰撞类2. 给地图添加碰撞体3. 让人物可以掉下去4. 实现人物向下跳跃5. 完整的代码继续编写魂斗罗 在上次的博客学习 Python 之 Pygame 开发魂斗罗(五)中,我…

感知趋势,洞察发展:2023(第十届)趋势与预测大会成功举办

2023年2月23日,运联年会:2023(第十届)趋势与预测大会在深圳机场凯悦酒店成功闭幕。自2014年开始,“运联年会:趋势与预测”已经连续举办九届。这场大会,既是一次行业性的“年终总结”&#xff0c…

(四)K8S 安装 Nginx Ingress Controller

ingress-nginx 是 Kubernetes 的入口控制器,使用NGINX作为反向代理和负载均衡器 版本介绍 版本1:Ingress NGINX Controller(k8s社区的ingres-nginx) 以 NGINX 开源技术为基础(kubernetes.io),可在GitHub的 kubernet…

记一次java.lang.ClassNotFoundException问题排查过程

记一次java.lang.ClassNotFoundException问题排查过程 同事提供一个or-simulation-engine.jar包(非maven项目,内部依赖很多其他jar,这个包是手动打出来的)给我,我集成到我的springboot项目中,在本地IDEA启…

Telnet 基础实验1: Telnet 实验

Telnet 基础实验1: Telnet 实验 拓扑图 配置命令 R1 的配置 undo ter mo sys sys R1 interface g0/0/0 ip address 192.168.1.1 255.255.255.0 qR2 的配置 undo ter mo system-view sysname R2 interface g0/0/0 ip address 192.168.1.2 255.255.255.0 q两台设…

day21_IO

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、作业 二、File 三、IO流 四、字节输入&输出流 零、 复习昨日 见晨考 一、作业 见答案二、File 2.1 介绍 File,通过一个路径代表文件或者文件夹 …

mysql(一) 使用注意事项及优化

初学mysql的时候、写了一份 "什么是CRUD? CRUD的操作" 的文章(18年的) 我开心看到有朋友经常在下面讨论一些问题、 但是以现在(今天 23年)回头看觉得 那些只是入门需要知道和掌握的、也刚好最近不是很忙 所…

区块链行业遭供应链攻击,上万加密钱包被“抄底”损失上亿美元

当地时间8月2日晚间, 区块链行业遭遇了一次行业重创 。据科技媒体TechCrunch报道, 若干名攻击者“抄底”了上万个加密钱包,钱包内有价值上亿美元的代币。 据了解遭受攻击的加密钱包包括Phantom、Slope和TrustWallet等。涉及到的币种除了SOL、…

网上招聘系统

技术:Java、JSP等摘要:当今,人类社会已经进入信息全球化和全球信息化、网络化的高速发展阶段。丰富的网络信息已经成为人们工作、生活、学习中不可缺少的一部分。人们正在逐步适应和习惯于网上贸易、网上购物、网上支付、网上服务和网上娱乐等…

为什么文档对 SaaS 公司至关重要?

在过去十年左右的时间里,SaaS的兴起使全球数百家公司成为家喻户晓的公司。但他们并不是仅仅依靠产品的力量到达那里的。客户服务和支持是使一切在幕后顺利进行的原因——其中很大一部分是文档。以正确的风格和正确的位置在您的网站上找到适当的用户文档对于将浏览器…

RNN相关知识总结

目录RNN结构与原理1.模型总览2.反向传播LSTM结构与原理1.模型总览2.如何解决RNN梯度消失/爆炸问题?GRU结构及原理1.模型总览LSTM与GRU的区别RNN结构与原理 1.模型总览 上图是RNN的展开结构图,由输入层、隐藏层和输出层组成。当前时间步t 的隐藏状态hth_…

【神经网络】Transformer基础问答

1.Transforme与LSTM的区别 transformer和LSTM最大的区别就是LSTM的训练是迭代的,无法并行训练,LSTM单元计算完T时刻信息后,才会处理T1时刻的信息,T 1时刻的计算依赖 T-时刻的隐层计算结果。而transformer的训练是并行了&#xff0…

快速找到外贸客户的9种方法(建议收藏)

所有外贸企业想要做好外贸出口的头等大事,就是要快速的找到优质的外贸客户和订单,没有订单的达成,所有的努力都是图劳,还有可能会陷入一种虚假的繁荣,每天都很忙,但是没有结果。今天,小编就来分…

第一章 1:函数

函数概念 函数我们可以简单的理解为一个自变量只对应一个函数值,如图: 如图所示的图像,我们可以把其理解为函数,那非函数呢? 这个就叫做非函数,因为我们的一个自变量对应了两个函数值。 函数的两要素&…

极智项目 | 实战pytorch arcface人脸识别

欢迎关注我的公众号 [极智视界],获取我的更多经验分享 大家好,我是极智视界,本文介绍 实战pytorch arcface人脸识别,并提供完整项目源码。 本文介绍的实战arcface人脸识别项目,提供完整的可以一键训练、测试的项目工程…