【应用】01.Linux操作系统简介
【嵌入式八股】一、语言篇https://www.nowcoder.com/creation/manager/columnDetail/mwQPeM
【嵌入式八股】二、计算机基础篇https://www.nowcoder.com/creation/manager/columnDetail/Mg5Lym
【嵌入式八股】三、硬件篇https://www.nowcoder.com/creation/manager/columnDetail/MRVDlM
【嵌入式八股】四、嵌入式Linux篇(本专栏)https://www.nowcoder.com/creation/manager/columnDetail/MQ2bb0
Linux应用编程
一、Linux操作系统简介
01.GNU是什么?
GNU是一个自由、开放源代码的操作系统,其名称是“GNU's Not Unix”的缩写。GNU操作系统由自由软件基金会(FSF)发起和维护,旨在提供一个完全自由、兼容Unix的操作系统。
GNU项目的目标是创建一个类Unix操作系统,但完全由自由软件组成。自由软件是指使用者拥有复制、分发、研究和改进软件的自由。GNU项目开始于1983年,是由理查德·斯托曼发起的,他也是自由软件运动的创始人之一。
GNU操作系统包含了许多基础的操作系统工具和应用程序,例如shell、编辑器、编译器、调试器、文本处理器、图像处理器、网络工具等等。此外,GNU项目还开发了许多自由软件,例如GNU Emacs、GCC、GDB等,这些软件在软件开发中得到了广泛的应用。
02.什么是Linux
Linux是一个免费、开源的操作系统内核,最初由芬兰程序员Linus Torvalds于1991年发布。Linux内核是许多自由、开源操作系统的基础,例如Ubuntu、Debian、Fedora、Red Hat Enterprise Linux等。与GNU操作系统一样,Linux也是一个类Unix的操作系统,具有良好的稳定性、安全性和可靠性。
Linux内核和GNU用户空间工具一起被称为Linux发行版(Linux distribution),包括了操作系统内核、GNU工具、GUI界面、应用程序等。Linux发行版可以免费下载、安装和使用,并且可以在各种硬件平台上运行,如个人电脑、服务器、移动设备等。
Linux的开放源代码、高度灵活性、可定制性、安全性和稳定性,使得它在服务器领域和嵌入式设备领域得到了广泛的应用。同时,也为个人用户和开发人员提供了一个高度自由的操作系统环境,可以定制和控制其软件和系统的各个方面。
03.Unix和Linux有什么区别?
Unix和Linux都是类Unix操作系统,它们在设计和实现上有很多相似之处,但它们也有一些区别,如下:
- 历史背景:Unix最初由AT&T贝尔实验室开发,最早发布于1971年。Linux则是由芬兰程序员Linus Torvalds于1991年开始开发的。
- 开源性质:Unix是一种闭源的商业操作系统,需要付费使用或获得许可。Linux则是一个免费开源的操作系统,任何人都可以自由地使用、复制和修改。
- 操作系统内核:Unix有多个版本的内核,例如Solaris、HP-UX、AIX等。而Linux只有一个内核,由Linus Torvalds和全球开发者共同维护。
- 发行版本:Unix的各种版本之间不太兼容,因此软件和驱动程序需要为每个版本单独编写。而Linux的许多版本(也称为发行版)是基于相同的内核和工具集构建的,因此软件和驱动程序通常可以跨多个发行版运行。
- 用户界面:Unix通常使用CDE、GNOME或KDE等桌面环境。Linux则可以选择多种桌面环境,例如GNOME、KDE、Xfce、LXDE等。
04.Windows和Linux的区别
Windows和Linux是两种不同的操作系统,它们在设计和实现上有很多相似之处,但也有很多区别,如下:
- 开源性质:Windows是闭源的商业操作系统,需要购买许可才能使用。Linux则是免费开源的操作系统,任何人都可以自由地使用、复制和修改。
- 用户界面:Windows的用户界面通常是基于图形化的桌面环境,例如Windows 10中的Windows Shell。Linux的用户界面可以选择不同的桌面环境,例如GNOME、KDE、Xfce、LXDE等。
- 应用程序:Windows的应用程序通常使用Windows API进行开发,这些应用程序只能在Windows上运行。Linux的应用程序通常是用开源工具和库进行开发,可以跨多个操作系统平台运行。
- 软件安装:Windows用户可以通过安装程序(.exe或.msi文件)安装软件。Linux用户可以通过软件包管理器安装软件,或者从源代码编译安装软件。
- 安全性:由于Windows的市场份额较大,因此成为了攻击者的主要目标。相比之下,Linux的市场份额较小,因此受到的攻击较少。
- 性能:Linux操作系统通常被认为比Windows更稳定、更快。
05.bin和elf文件的区别:orange:
ELF 文件(可重定位文件)及文件格式 ELF 文件和 BIN 文件的区别 - 流水灯 - 博客园 (cnblogs.com)
Bin文件和ELF文件都是计算机程序的可执行文件格式。它们之间的主要区别在于它们的结构和用途。
Bin文件是一种简单的二进制文件格式,通常包含原始的机器指令代码,没有调试信息和符号表等元数据。这种文件格式常常用于ROM芯片和嵌入式系统等场景。.bin文件是由.elf文件为原材料生成,制作工具是交叉工具编译链里的arm-linux-objcopy。.bin文件在.elf的基础上,去掉了相关的符号信息,CPU读取到.bin文件里的内容就可以直接运行。
ELF文件(Executable and Linkable Format)是一种用于UNIX系统的可执行文件格式。它包含可执行代码、符号表、动态链接信息等元数据,可以通过链接器将多个目标文件组合成一个可执行文件。ELF文件可以动态链接,意味着程序可以在运行时加载和链接共享库,从而节省内存空间。
符号表机制(readelf -s XXX)
编译原理之符号表_编译符号表_Welkin_qing的博客-CSDN博客
符号表保存了程序实现或使用的所有全局变量和函数,作用如下:
收集符号属性
上下文语义的合法性检查的依据
作为目标代码生成阶段地址分配的依据
06.Linux下可执行程序的分段
Linux——size命令查看二进制文件各个数据段_text data bss dec hex_HungXum的博客-CSDN博客
1.text:存放了代码,常量,字符串常量等
2.data:存放了初始化的全局/静态变量
3.bss:存放了未初始化的全局/静态变量
以上都是编译过程中就已经确定了内存空间的,栈和堆的数据都是在运行时动态分配的,所以没办法在二进制文件中显式大小。
07.Linux的基本组件有哪些
Linux系统的组成部分?
Linux 的基本组件包括:
- 内核(Kernel):Linux 内核是 Linux 操作系统的核心组件,它是操作系统和硬件之间的接口,负责管理系统资源和提供各种服务。
- Shell:Shell 是 Linux 操作系统中用户和内核之间的交互界面。它是一个命令解释器,能够解释用户输入的命令并将其转换成内核能够理解的指令。
- 文件系统(File System):Linux 文件系统是 Linux 操作系统中存储数据的组织方式。Linux 支持多种文件系统,例如 ext4、btrfs 等。
- 应用程序:Linux 操作系统中有许多应用程序,例如文本编辑器、浏览器、终端模拟器等,这些应用程序能够帮助用户完成各种任务。
- 用户空间工具:用户空间工具是一组命令行工具和库,用于管理系统资源、执行系统任务和编写应用程序等。
- 设备驱动程序:设备驱动程序是 Linux 内核中的一部分,用于管理硬件设备和提供接口,让软件能够与硬件设备进行交互。
08.环境变量是什么?
环境变量是指在操作系统中设置的一些变量,用于控制应用程序的行为和操作系统的配置。环境变量通常由操作系统或者应用程序在运行时动态设置或读取。
在 Linux 或者 Unix 系统中,环境变量通常使用以下格式表示:VARNAME=value
。其中 VARNAME
是环境变量的名称,value
是环境变量的值。例如,PATH=/usr/bin:/usr/local/bin
表示设置了名为 PATH
的环境变量,其值为 /usr/bin:/usr/local/bin
。
常用的环境变量包括:
- PATH:指定了系统的可执行文件的搜索路径,当用户执行命令时,系统会按照 PATH 中指定的顺序在这些路径中查找可执行文件。
- HOME:指定了用户的主目录,当用户打开终端时,默认会进入这个目录。
- LANG:指定了系统的默认语言和字符集。
- SHELL:指定了用户使用的默认 shell。
- TERM:指定了终端的类型。
- PWD:当前工作目录。
通过设置环境变量,我们可以控制应用程序的行为,例如更改默认搜索路径、更改语言、更改终端类型等等。在 Linux 系统中,我们可以使用 export
命令来设置环境变量,例如:export VARNAME=value
。
09.什么是重定向?
重定向(Redirection)是指将命令的输出或输入从标准的输入、输出设备(通常是终端)转向到其他文件、设备或进程的过程。在 Linux 和其他类 Unix 操作系统中,重定向是一种非常有用的技术,可以方便地进行文件操作、输入输出处理和程序调试等操作。
在 Linux 中,可以使用以下几种重定向符号:
>
:将命令的输出重定向到一个文件中,例如:ls > file.txt
,将ls
命令的输出保存到file.txt
文件中。>>
:将命令的输出附加到一个文件的末尾,例如:echo "Hello" >> file.txt
,将字符串 "Hello" 追加到file.txt
文件的末尾。<
:将文件内容作为命令的输入,例如:sort < file.txt
,将file.txt
文件的内容作为sort
命令的输入。2>
:将命令的错误输出重定向到一个文件中,例如:ls no_such_file 2> error.txt
,将ls
命令产生的错误信息保存到error.txt
文件中。&>
:将命令的标准输出和错误输出都重定向到一个文件中,例如:ls no_such_file &> output.txt
,将ls
命令的输出和错误信息都保存到output.txt
文件中。
重定向符号可以组合使用,例如:command1 | command2 > file.txt
,表示将 command1
命令的输出作为 command2
命令的输入,并将 command2
命令的输出重定向到 file.txt
文件中。
重定向还可以用于管道、进程替换和文件描述符等高级用法,这些用法在 Linux 的 shell 脚本和命令行操作中都非常常见。
10.Linux系统的挂起、待机、休眠?
体眠是一种更加省电的模式,它将内存中的数据保存于硬盘中,所有设备都停止工作。当再次使用时需按开关机键,机器将会恢复到您的执行休眠时的状态,而不用再次执行启动操作系统复杂的过程。
待机(挂起)是将当前处于运行状态的数据保存在内存中,机器只对内存供电,而硬盘、屏幕和CPU等部件则停止供电。由于数据存储在速度快的内存中,因此进入等待状态和唤醒的速度比较快。不过这些数据是保存在内存中,如果断电则会使数据丢失。
11.在用户态开发中程序跑飞,出现段错误等情况,你通过什么方式去定位?
运行态的错误怎么调试?
段错误就是指访问的内存超出了系统所给这个程序的内存空间
在用户态开发中,程序跑飞和段错误可能是由于代码中存在错误或非法操作导致的,可以通过以下几种方式进行定位和调试:
- 代码审查:寻找代码中的潜在问题和错误。发现代码中的逻辑错误、死锁等问题,提高代码质量。
- 使用调试器:使用gdb等调试器可以对程序进行单步调试、打印变量值等操作,快速定位代码错误的位置。在程序运行时出现异常时,可以使用调试器的core dump功能生成core文件,通过core文件定位程序出现问题的原因。
- 日志输出:在程序中加入日志输出语句,将关键的信息记录下来,便于后续分析。可以使用printf、syslog等方式输出日志,也可以使用专业的日志框架,如log4j等。
- 硬件调试工具:如果程序涉及硬件调用,可以使用硬件调试工具,如逻辑分析仪、示波器等,对硬件进行调试。
- 静态分析工具:使用静态分析工具对代码进行扫描,查找代码中的潜在问题,如空指针、内存泄漏、未初始化变量等。常用的静态分析工具包括Coverity、PVS-Studio等。
- 动态分析工具:使用动态分析工具对程序进行运行时监控,如检测内存泄漏、检测代码覆盖率等。常用的动态分析工具包括Valgrind、strace等。
- core dump文件分析:在程序发生崩溃时,可以通过core dump文件进行分析,查找出现问题的原因。可以使用gdb等调试器对core dump文件进行分析,找出导致程序崩溃的代码位置。
12.Linux怎么拷贝远程服务器的文件
要从远程服务器拷贝文件到本地系统,通常可以使用以下方法:
-
scp命令(Secure Copy):scp是一个安全的文件传输工具,可以使用SSH协议来拷贝文件。以下是scp的基本语法:
bash复制代码scp [options] [source] [destination]
[options]
:可以包括一些选项,例如-r
用于递归拷贝目录。[source]
:远程服务器上的源文件或目录路径,可以使用用户名和主机名以及文件路径,例如user@remote_server:/path/to/remote/file
。[destination]
:本地系统上的目标路径。
例如,从远程服务器复制文件到本地:
bash复制代码scp user@remote_server:/path/to/remote/file /path/to/local/destination/
-
rsync命令:rsync是一个强大的文件同步工具,可以通过SSH协议进行远程拷贝。它的语法如下:
bash复制代码rsync [options] [source] [destination]
[options]
:可以包括一些选项,例如-avz
用于以递归、压缩等方式同步文件。[source]
:远程服务器上的源文件或目录路径,可以使用用户名和主机名以及文件路径,例如user@remote_server:/path/to/remote/file
。[destination]
:本地系统上的目标路径。
例如,使用rsync从远程服务器同步文件到本地:
bash复制代码rsync -avz user@remote_server:/path/to/remote/file /path/to/local/destination/
-
FTP或SFTP客户端:您还可以使用FTP或SFTP客户端来与远程服务器交互,从而拷贝文件。这通常需要安装FTP或SFTP客户端并登录到远程服务器,然后使用get命令来下载文件。
这些方法中,scp和rsync通常是最常用的,特别是在需要安全传输文件时,因为它们使用SSH协议进行传输,可以确保数据的加密和安全性。
13.Linux设置开机自启的方法
linux设置开机自启动的三种方法
一、rc.local文件中添加自启动命令
1、执行命令: 编辑"/etc/rc.local"
vi /ect/rc.local
2、然后在文件最后一行添加要执行程序的全路径。 例如,每次开机时要执行一个hello.sh,这个脚本放在/usr下面,那就可以在"/etc/rc.local"中加一行"/usr/./hello.sh",或者" cd /usr/ && ./hello.sh "
注意,你的命令应该添加在:exit 0 之前
3、添加完保存后设置rc.local可执行权限
chmod +x /etc/rc.local
二、在/etc/init.d目录下添加自启动脚本
linux在“/etc/rc.d/init.d”下有很多的文件,每个文件都是可以看到内容的,其实都是一些shell脚本或者可执行二进制文件
Linux开机的时候,会加载运行/etc/init.d目录下的程序,因此我们可以把想要自动运行的脚本放到这个目录下即可。系统服务的启动就是通过这种方式实现的。
PS:添加完后务必设置文件的可执行权限 chmod +x filename
三、制作Linux服务并设置开机自启动
1、简介
本文以nginx为例,通过制作linux服务的方式启动,并设置开机启动
2、前提条件
nginx已安装,默认安装路径为:/usr/local/nginx
3、方法步骤
1)制作服务 在/etc/systemd/system/路径下创建nginx.service文件
cd /etc/systemd/system/
vi nginx.service
写入如下内容
[Unit]
Description=nginx - high performance web server
After=nginx.service
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
Execenable=/usr/local/nginx/sbin/nginx
[Install]
WantedBy=multi-user.target
保存并退出
2)设置开机自启动
# 设置开机启动
systemctl enable nginx
# 取消开机自启动
#systemctl disable nginx
# 查看服务当前状态
systemctl status nginx
# 启动nginx服务
systemctl start nginx
# 停止nginx服务
systemctl stop nginx
# 重启nginx服务
systemctl restart nginx
#C++##嵌入式##八股##面试##笔试#查阅整理上千份嵌入式面经,将相关资料汇集于此,主要包括: 0.简历面试 1.语言篇 2.计算机基础 3.硬件篇 4.嵌入式Linux【本专栏】 (建议PC端查看)