欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 焦点 > 嵌入式经典面试题之操作系统(一)

嵌入式经典面试题之操作系统(一)

2025/1/31 23:23:45 来源:https://blog.csdn.net/kk1kk2kk3kk4/article/details/145393794  浏览:    关键词:嵌入式经典面试题之操作系统(一)

文章目录

    • 1 请你说说常用的Linux命令有哪些?
    • 2 在linux中如何创建一个新的目录?
    • 3 Linux中查看进程运行状态的指令、tar解压文件的参数。
    • 4 在linux中,文件权限如何修改?
    • 5 怎样以root权限运行某个程序?
    • 6 在linux里如何查看一个进程?
    • 7 在Linux里如何看带关键字日志文件?
    • 8 在Linux中修改主机名的命令是什么?
    • 9 简述GDB常见的调试命令?什么是条件断点?多进程下如何调试?

1 请你说说常用的Linux命令有哪些?

  • ls:列出目录内容
ls -l
ls -a
  • cd:切换目录
cd /path/to/directory
  • pwd:显示当前工作目录
pwd
  • mkdir:创建目录
mkdir new_directory
  • rm:删除文件或目录
rm file.txt
  • cp:复制文件或目录
cp source.txt destination.txt
  • mv:移动或重命名文件
mv oldname.txt newname.txt
  • find:查找文件
find /path -name "filename"
  • cat:查看文件内容
cat file.txt
  • chmod:修改文件权限
chmod 777 file.sh
  • chown:更改文件所有者
  • ps:显示当前进程
ps aux
  • top:动态显示系统任务
  • kill:终止进程
kill PID
  • jobs:显示后台任务
  • bgfg:后台和前台控制
  • whoami:显示当前用户
  • who:显示登录用户
  • useradd / userdel:添加和删除用户
  • passwd:更改密码
  • uptime:查看系统运行时间
  • uname:查看系统信息
  • reboot / shutdown:重启和关机
  • tar:打包和解包
tar -czvf archive.tar.gz file.txt
tar -xzvf archive.tar.gz
  • zipunzip:压缩和解压缩
zip archive.zip file.txt
unzip archive.zip

2 在linux中如何创建一个新的目录?

语法如下:

mkdir 新目录名

例子:比如我们要创建一个创建一个名为 game 的新目录:

mkdir game

比如你想一次创建多个目录:

mkdir game1 game2 game3

比如你想创建一个嵌套目录(创建父目录及其子目录),那我们可以使用 -p 选项:

mkdir -p parent/child/grandchild

这个命令会创建 parent 目录,里面有 child 目录,而 child 目录下会有 grandchild 目录。如果父目录不存在,-p 会自动创建它们。

3 Linux中查看进程运行状态的指令、tar解压文件的参数。

在Linux中,可以使用以下指令查看进程的运行状态:

top命令

用于实时监视系统的进程活动和系统资源使用情况。在终端中运行top命令,可以查看进程的CPU占用、内存占用、运行时间等信息。

ps 命令

ps 是查看当前进程的基本命令。常用的参数有:

  • ps aux:显示所有进程,包括其他用户的进程。
  • ps -ef:显示系统中的所有进程,类似 ps aux

对于tar解压文件,可以使用以下参数:

  • x:表示解压文件。
  • v:可选参数,表示显示详细的解压过程。
  • f:后面接需要解压的文件名。
  • z:可选参数,用于解压gzip格式的文件。
  • j:可选参数,用于解压bzip2格式的文件。
  • C:指定解压目录,后面接目标目录。

例如,使用以下命令解压一个tar文件:tar -xvf file.tar

如果需要解压一个gzip格式的tar文件,可以使用以下命令:tar -xzvf file.tar.gz

4 在linux中,文件权限如何修改?

在说明文件权限修改之前我们简单先说说这些代表什么意思, chmod 是一个命令,用来修改文件和目录的权限。 读 ®写 (w) 和 执行 (x)分别代表文件权限,而这些权限分别赋予 用户 (user)用户组 (group)其他用户 (others)

查看权限:使用 ls -l 命令查看文件和目录的权限:

ls -l file.txt

输出类似:

-rwxr-xr--  1 user group  size date file.txt

权限字段中的每个字符表示不同的用户权限。

修改权限:数字 4 表示读(r),2 表示写(w),1 表示执行(x)。将数字相加表示不同的权限组合。常见权限组合:

r--4只读
rw-6读写
rwx7读写执行

例子:

  1. 赋予用户可读写,用户组和其他人只读
  2. 赋予所有人读写执行权限
  3. 用户读写执行,用户组读执行,其他用户只读

递归修改目录权限:使用 -R 参数可以递归修改目录及其所有子目录和文件的权限:

chmod -R 755 /path/to/directory

5 怎样以root权限运行某个程序?

使用 sudo 运行程序sudo允许授权用户以超级用户权限执行命令。

用法:

sudo chown root app(文件名)
或
sudo chmod u+s app(文件名)

使用 su 切换到 root 用户su命令可以切换到另一个用户,通常用于切换到 root 用户,执行完命令后,返回普通用户模式。

用法:

su -

(注意,- 表示切换到 root 用户并加载 root 用户的环境变量)

启用 root 用户:有些 Linux 发行版(如 Ubuntu)默认禁用 root 用户,使用 sudo 来进行权限管理。如果需要启用 root 用户,可以运行:

sudo passwd root

然后输入新密码来启用 root 用户。

6 在linux里如何查看一个进程?

  • ps aux | grep process_name:查找并显示特定进程。
  • top:实时显示进程,适合动态查看。
  • htop:增强版 top,有图形化界面,便于操作。
  • pgrep process_name:查找进程的 PID。
  • pidof process_name:查看指定进程的 PID。
  • lsof -i :port:查看占用特定端口的进程。
  • pstree:查看进程的树状结构,显示父子进程关系。

7 在Linux里如何看带关键字日志文件?

  • grep "关键字" /path/to/logfile:基本查找。
  • grep -n "关键字" /path/to/logfile:显示行号。
  • grep -i "关键字" /path/to/logfile:忽略大小写。
  • grep -A N "关键字" /path/to/logfile:显示匹配行之后 N 行。
  • grep -B N "关键字" /path/to/logfile:显示匹配行之前 N 行。
  • grep -r "关键字" /path/to/directory:递归搜索目录中的日志文件。

接下来我们在对grep命令的一些补充,grep 是 Linux 和类 Unix 系统中一个非常强大的命令行工具,用于在文件中搜索文本,尤其擅长使用正则表达式来进行复杂的模式匹配。

用法:

grep [选项] '模式' 文件
  • 模式:表示你要查找的文本或正则表达式。
  • 文件:你要搜索的文件,支持多个文件。

例子:查找文件 file.txt 中所有包含 “game” 的行:

grep "game" file.txt

常用选项grep 提供了许多选项来增强其功能,以下是一些最常用的选项:

-i:忽略大小写

  • 默认情况下,grep是区分大小写的。如果希望忽略大小写,可以使用 -i 选项。
grep -i "game" file.txt

-n:显示行号

  • 使用 -n 可以显示匹配行的行号,帮助快速定位。
grep -n "game" file.txt

-v:反向匹配

  • -v选项表示显示不匹配的行,即排除掉匹配指定模式的行。
grep -v "game" file.txt

-l:只显示文件名

  • -l选项让 grep 只显示包含匹配模式的文件名,而不显示匹配的内容。
grep -l "game" *.txt

-r -R:递归查找

  • -r 或 -R 选项让 grep 在目录中递归地搜索所有文件。
grep -r "game" /path/to/directory

-c:只显示匹配行的计数

  • -c 选项可以统计匹配模式的行数,而不是显示匹配的行内容。
grep -c "game" file.txt

-w:匹配整个单词

  • -w 选项可以确保匹配的模式是整个单词,而不是模式的一部分。
grep -w "game" file.txt

-A N:显示匹配行及其之后的 N 行

  • -A 选项显示匹配行后面 N 行内容,常用于查看上下文。
grep -A 2 "game" file.txt

-B N:显示匹配行及其之前的 N 行

  • -B 选项显示匹配行前面 N 行内容。
grep -B 2 "game" file.txt

-C N:显示匹配行及其前后各 N 行

  • -C 选项显示匹配行前后各 N 行内容,便于查看上下文。
grep -C 2 "game" file.txt

--color:高亮显示匹配结果

  • 使用 --color 选项可以高亮显示匹配的关键字,便于阅读。
grep --color "game" file.txt

正则表达式支持:

  • .:匹配任意单个字符。
  • \*:匹配零个或多个字符。
  • ^:匹配行的开始。
  • $:匹配行的结束。
  • []:匹配字符集中的任何一个字符。
  • |:表示“或”,用于选择多个模式。
  • ():分组,用于组合多个模式。

例子:

  • 查找以 “game” 开头的行:
  • 查找以 “apple” 或 “banana” 开头的行:
  • 查找包含数字的行:

8 在Linux中修改主机名的命令是什么?

(1)使用 hostnamectl 命令

修改主机名:

sudo hostnamectl set-hostname 新主机名

例子:

sudo hostnamectl set-hostname mynewhostname

这将更改系统的主机名,并且通常不需要重启。请注意,在某些系统上,修改主机名后可能需要重启系统才能使更改生效。

查看当前主机名:

hostnamectl

这个命令会输出类似以下内容:

Static hostname: mynewhostnameIcon name: computer-vmChassis: vmMachine ID: xxxxxxxxBoot ID: xxxxxxxxOperating System: Ubuntu 20.04 LTSKernel: Linux 5.4.0-80-genericArchitecture: x86-64

(2)修改 /etc/hostname 文件

例子:

  1. 使用编辑器打开 /etc/hostname 文件:
  2. 修改文件中的主机名为新的主机名,保存并退出。
  3. 为了让主机名生效,还需要修改 /etc/hosts 文件。在文件中,找到以下行并将主机名更新为新的名称:修改为:
  4. 重启系统或使用以下命令让主机名更改生效:

(3)使用 hostname 命令

hostname 命令也可以用来临时更改主机名,但这种更改在重启后会丢失。

临时修改主机名:

sudo hostname 新主机名

例子:

sudo hostname mynewhostname

9 简述GDB常见的调试命令?什么是条件断点?多进程下如何调试?

启动GDB

  • 启动 gdb 并加载指定的程序。例如:
gdb ./myprogram

设置断点

  • 断点是程序执行到某一特定位置时会停止执行,允许你检查程序状态(例如变量值、内存等)。
  • break b:设置断点。可以在指定函数名或行号处设置断点。
break main       # 在 main 函数处设置断点
break 50        # 在第 50 行设置断点

删除断点

  • deleted:删除所有或指定的断点。
delete      # 删除所有断点
delete 1    # 删除编号为 1 的断点

启动程序

  • run r:开始运行程序,直到程序遇到断点或完成。

单步调试

  • nextn:执行当前行,跳过当前行中调用的函数,进入下一行代码。
  • step s:逐过程执行,进入函数内部,逐行调试函数内部的代码。
  • finish:在当前函数执行完毕后,返回到调用该函数的地方。

继续执行程序

  • continuec:继续程序的执行,直到遇到下一个断点或程序结束。

查看当前堆栈信息

  • backtrace bt:查看当前的函数调用堆栈(栈回溯),有助于定位程序错误位置。
  • backtrace N:显示最近的 N 层堆栈信息。

查看和修改变量值

  • printp:查看变量的值。
print x         # 查看变量 x 的值
print myfunc()  # 查看函数调用的返回值

set:修改变量的值。

set variable x = 10   # 将 x 的值设置为 10  

查看源代码

  • list l:显示当前执行位置附近的源代码。
  • list 结合行号或函数名:查看特定函数或行附近的代码。

查看和修改内存

  • x:查看内存内容,按指定格式输出内存。

查看程序运行状态

  • info:查看程序状态、变量值、寄存器值等。 info locals:显示当前函数的局部变量。info registers:显示当前寄存器的值。info threads:查看当前程序中的线程信息。

设置和显示条件断点

  • watch:设置条件断点,观察某个变量的变化。
  • info watchpoints:查看所有设置的 watchpoints。

查看内存泄漏

  • mallocfree:用来查看内存分配和释放的情况(如果启用了相应的调试选项)。

退出 GDB

  • quitq:退出 GDB。

条件断点

  • 条件断点是指断点只有在特定条件满足时才会触发。
  • break 设置条件断点 通过在设置断点时添加条件,可以只在特定条件为真时停止程序。

例子:

break myfunc if x > 10

这表示只有当 x > 10 时,程序会在 myfunc 函数入口处暂停。

  • 多条件断点: 你可以结合多个条件,使用 &&|| 来设置复杂的条件断点。

例子:

break myfunc if (x > 10 && y < 5)

这个断点会在 myfunc 函数入口处,且 x > 10y < 5 时生效。

多进程下的调试

  • 在调试涉及多个进程(如多线程程序、父子进程或多进程应用)时,GDB 提供了一些特别的功能来帮助调试这些进程。

调试多进程应用

当程序创建多个子进程时,可以使用 GDB 进行进程间的调试。每个进程都会有一个唯一的进程 ID(PID)。

  • info inferiors:显示所有的子进程。
  • inferior:切换到指定的进程进行调试。
  • attach:将 GDB 附加到已经存在的进程。
  • detach:从当前进程中分离(不再调试当前进程)。

调试多线程程序

  • 在多线程程序中,GDB 允许你调试特定的线程。
  • info threads:列出所有线程的信息,包括线程号和状态。
info threads
  • thread:切换到指定线程进行调试。例如,切换到线程5:
thread 5
  • break 设置线程特定断点:你可以设置仅在特定线程上触发的断点。
break myfunc if pthread_self() == 5

使用 set follow-fork-mode 调试父子进程

  • set follow-fork-mode parent:当 fork() 被调用时,GDB 会继续调试父进程。
  • set follow-fork-mode child:当 fork() 被调用时,GDB 会继续调试子进程。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com