【Linux】Linux经典面试题

文章目录

    • 1. Linux文件系统
      • 1.1 什么是inode?
      • 1.2 硬链接和软链接的区别
      • 1.3 文件权限和所有权
    • 2. Linux进程管理
      • 2.1 进程和线程的区别
      • 2.2 进程间通信(IPC)
      • 2.3 守护进程(Daemon)
    • 3. Linux内存管理
      • 3.1 虚拟内存和物理内存
      • 3.2 内存分配方式
      • 3.3 内存泄漏
    • 4. Linux网络编程
      • 4.1 TCP和UDP的区别
      • 4.2 套接字编程
    • 5. Linux Shell脚本
      • 5.1 Shell脚本基础
      • 5.2 常用的Shell命令
    • 6. Linux性能调优
      • 6.1 如何查看系统性能
      • 6.2 如何优化系统性能
    • 7. 总结

在这里插入图片描述

在C++开发中,Linux系统的知识是不可或缺的一部分。无论是系统编程、网络编程,还是性能优化,Linux都扮演着重要的角色。因此,Linux相关的面试题在C++程序员的面试中经常出现。本文将总结一些经典的Linux面试题,帮助大家更好地准备面试。

1. Linux文件系统

1.1 什么是inode?

在Linux文件系统中,每个文件都有一个唯一的inode(索引节点)。inode存储了文件的元数据,包括文件的大小、权限、所有者、组、时间戳(如创建时间、修改时间等)以及指向文件数据块的指针。文件名并不存储在inode中,而是存储在目录项中。目录项将文件名与inode号关联起来。

面试题: 如何查看文件的inode号?

答案: 可以使用ls -i命令查看文件的inode号。例如:

ls -i filename

1.2 硬链接和软链接的区别

硬链接(Hard Link)软链接(Symbolic Link,又称符号链接) 是Linux文件系统中两种不同的链接方式。

  • 硬链接: 硬链接是文件系统中的一个目录项,它直接指向文件的inode。硬链接与原始文件共享相同的inode号,因此它们实际上是同一个文件的不同名称。删除原始文件不会影响硬链接,因为inode的引用计数会减少,只有当引用计数为0时,文件才会被真正删除。

  • 软链接: 软链接是一个特殊的文件,它包含了指向另一个文件的路径。软链接有自己的inode号,并且可以跨文件系统。如果删除原始文件,软链接将变成“悬空链接”,指向一个不存在的文件。

面试题: 如何创建硬链接和软链接?

答案: 使用ln命令可以创建硬链接和软链接。

  • 创建硬链接:
ln source_file hard_link
  • 创建软链接:
ln -s source_file soft_link

1.3 文件权限和所有权

Linux文件系统中的每个文件都有权限和所有权信息。权限分为三类:所有者权限、组权限和其他用户权限。每类权限包括读(r)、写(w)和执行(x)三种。

面试题: 如何修改文件的权限和所有权?

答案: 使用chmod命令可以修改文件权限,使用chown命令可以修改文件的所有者和组。

  • 修改文件权限:
chmod 755 filename  # 设置文件权限为rwxr-xr-x
  • 修改文件所有者:
chown user:group filename  # 将文件的所有者改为user,组改为group

2. Linux进程管理

2.1 进程和线程的区别

进程 是操作系统资源分配的基本单位,每个进程都有独立的内存空间和系统资源。线程 是进程内的执行单元,多个线程共享同一个进程的内存空间和资源。

面试题: 如何查看当前系统中的进程?

答案: 使用ps命令可以查看当前系统中的进程。常用的选项包括:

  • ps aux:显示所有用户的进程。
  • ps -ef:显示所有进程的完整信息。

2.2 进程间通信(IPC)

Linux提供了多种进程间通信机制,包括管道、消息队列、共享内存、信号量和套接字等。

面试题: 请列举几种进程间通信的方式,并简要说明其特点。

答案:

  • 管道(Pipe): 管道是一种半双工的通信方式,数据只能单向流动。管道通常用于父子进程之间的通信。

  • 消息队列(Message Queue): 消息队列允许进程通过发送和接收消息来通信。消息队列是异步的,发送方和接收方不需要同时存在。

  • 共享内存(Shared Memory): 共享内存允许多个进程共享同一块内存区域。共享内存是最快的IPC机制,但需要额外的同步机制(如信号量)来避免竞争条件。

  • 信号量(Semaphore): 信号量用于进程间的同步,通常用于控制对共享资源的访问。

  • 套接字(Socket): 套接字可以用于不同主机之间的进程通信,也可以用于同一主机上的进程通信。

2.3 守护进程(Daemon)

守护进程 是在后台运行的进程,通常没有控制终端。守护进程通常用于提供系统服务,如Web服务器、数据库服务器等。

面试题: 如何创建一个守护进程?

答案: 创建守护进程的步骤通常包括:

  1. 调用fork()创建子进程,然后退出父进程。
  2. 调用setsid()创建一个新的会话,并成为会话组长。
  3. 再次调用fork()创建孙子进程,然后退出子进程。
  4. 关闭所有打开的文件描述符。
  5. 将标准输入、标准输出和标准错误重定向到/dev/null
  6. 改变当前工作目录为根目录。

以下是一个简单的守护进程创建示例:

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>

int main() {
    pid_t pid = fork();
    if (pid < 0) {
        exit(EXIT_FAILURE);
    }
    if (pid > 0) {
        exit(EXIT_SUCCESS);  // 父进程退出
    }

    // 子进程成为会话组长
    if (setsid() < 0) {
        exit(EXIT_FAILURE);
    }

    // 再次fork,确保守护进程不会获取控制终端
    pid = fork();
    if (pid < 0) {
        exit(EXIT_FAILURE);
    }
    if (pid > 0) {
        exit(EXIT_SUCCESS);  // 子进程退出
    }

    // 关闭所有打开的文件描述符
    for (int i = sysconf(_SC_OPEN_MAX); i >= 0; --i) {
        close(i);
    }

    // 重定向标准输入、输出、错误到/dev/null
    int fd = open("/dev/null", O_RDWR);
    dup2(fd, STDIN_FILENO);
    dup2(fd, STDOUT_FILENO);
    dup2(fd, STDERR_FILENO);
    if (fd > STDERR_FILENO) {
        close(fd);
    }

    // 改变工作目录到根目录
    chdir("/");

    // 守护进程的主循环
    while (1) {
        // 守护进程的工作
        sleep(1);
    }

    return EXIT_SUCCESS;
}

3. Linux内存管理

3.1 虚拟内存和物理内存

虚拟内存 是操作系统为每个进程提供的抽象内存空间。每个进程都认为自己拥有连续的、独立的内存空间,而实际上这些内存可能分散在物理内存和磁盘上。物理内存 是实际的硬件内存,操作系统通过页表将虚拟内存映射到物理内存。

面试题: 什么是页表?它的作用是什么?

答案: 页表是操作系统用于管理虚拟内存和物理内存之间映射的数据结构。每个进程都有自己的页表,页表将虚拟内存地址映射到物理内存地址。当进程访问虚拟内存时,操作系统通过页表找到对应的物理内存地址。

3.2 内存分配方式

Linux提供了多种内存分配方式,包括mallocmmapbrk等。

面试题: mallocmmap的区别是什么?

答案:

  • malloc malloc是C标准库中的函数,用于在堆上分配内存。malloc通常通过brksbrk系统调用来调整堆的大小,然后在堆上分配内存块。

  • mmap mmap是系统调用,用于将文件或设备映射到进程的地址空间。mmap也可以用于分配匿名内存(不映射任何文件),通常用于分配大块内存。

3.3 内存泄漏

内存泄漏 是指程序在动态分配内存后,未能正确释放内存,导致内存占用不断增加,最终可能导致系统内存耗尽。

面试题: 如何检测内存泄漏?

答案: 可以使用工具如valgrind来检测内存泄漏。valgrind是一个内存调试工具,可以检测内存泄漏、非法内存访问等问题。

valgrind --leak-check=full ./your_program

4. Linux网络编程

4.1 TCP和UDP的区别

TCP(传输控制协议)UDP(用户数据报协议) 是两种常用的传输层协议。

  • TCP: TCP是面向连接的协议,提供可靠的数据传输。TCP通过三次握手建立连接,通过四次挥手断开连接。TCP保证数据包的顺序和完整性,适合需要可靠传输的应用,如文件传输、Web浏览等。

  • UDP: UDP是无连接的协议,不保证数据包的顺序和完整性。UDP传输速度快,适合实时性要求高的应用,如视频流、在线游戏等。

面试题: 如何查看当前系统的网络连接?

答案: 使用netstat命令可以查看当前系统的网络连接。

netstat -tuln  # 查看TCP和UDP监听端口
netstat -anp   # 查看所有网络连接及其对应的进程

4.2 套接字编程

套接字(Socket) 是网络编程的基础,用于在不同主机之间或同一主机上的进程之间进行通信。

面试题: 请简要描述TCP套接字编程的基本步骤。

答案: TCP套接字编程的基本步骤包括:

  1. 创建套接字: 使用socket()函数创建套接字。
  2. 绑定地址: 使用bind()函数将套接字绑定到本地地址和端口。
  3. 监听连接: 使用listen()函数开始监听连接请求。
  4. 接受连接: 使用accept()函数接受客户端的连接请求。
  5. 发送和接收数据: 使用send()recv()函数进行数据传输。
  6. 关闭套接字: 使用close()函数关闭套接字。

以下是一个简单的TCP服务器示例:

#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <cstring>
#include <iostream>

int main() {
    int server_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (server_fd < 0) {
        std::cerr << "Socket creation failed" << std::endl;
        return 1;
    }

    struct sockaddr_in address;
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(8080);

    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
        std::cerr << "Bind failed" << std::endl;
        return 1;
    }

    if (listen(server_fd, 5) < 0) {
        std::cerr << "Listen failed" << std::endl;
        return 1;
    }

    int client_fd = accept(server_fd, nullptr, nullptr);
    if (client_fd < 0) {
        std::cerr << "Accept failed" << std::endl;
        return 1;
    }

    char buffer[1024] = {0};
    ssize_t bytes_read = read(client_fd, buffer, sizeof(buffer));
    std::cout << "Received: " << buffer << std::endl;

    const char *response = "Hello from server";
    send(client_fd, response, strlen(response), 0);

    close(client_fd);
    close(server_fd);

    return 0;
}

5. Linux Shell脚本

5.1 Shell脚本基础

Shell脚本 是用于自动化任务和系统管理的脚本语言。常见的Shell包括Bash、Zsh等。

面试题: 如何编写一个简单的Shell脚本?

答案: 以下是一个简单的Shell脚本示例,用于输出当前日期和时间:

#!/bin/bash
echo "Current date and time: $(date)"

5.2 常用的Shell命令

面试题: 请列举一些常用的Shell命令及其用途。

答案:

  • ls 列出目录内容。
  • cd 切换目录。
  • pwd 显示当前工作目录。
  • cp 复制文件或目录。
  • mv 移动或重命名文件或目录。
  • rm 删除文件或目录。
  • grep 在文件中搜索文本。
  • find 查找文件或目录。
  • chmod 修改文件权限。
  • chown 修改文件所有者。

6. Linux性能调优

6.1 如何查看系统性能

面试题: 如何查看系统的CPU、内存和磁盘使用情况?

答案: 可以使用以下命令查看系统性能:

  • top 实时显示系统的CPU、内存和进程信息。
  • htop top的增强版,提供更友好的界面和更多功能。
  • free 查看内存使用情况。
  • df 查看磁盘空间使用情况。
  • iostat 查看磁盘I/O统计信息。

6.2 如何优化系统性能

面试题: 请列举几种优化Linux系统性能的方法。

答案:

  • 调整内核参数: 通过修改/etc/sysctl.conf文件中的参数,可以优化系统的网络性能、内存管理等。

  • 使用SSD: 将系统安装在SSD上,可以显著提高磁盘I/O性能。

  • 优化进程调度: 使用nicerenice命令调整进程的优先级,确保关键任务获得更多的CPU资源。

  • 减少内存使用: 通过优化应用程序的内存使用,减少内存泄漏和不必要的内存分配。

  • 使用缓存: 使用缓存技术(如Redis、Memcached)减少数据库和磁盘的访问频率。

7. 总结

Linux作为C++程序员的重要开发环境,掌握其核心概念和常用工具是必不可少的。本文总结了Linux文件系统、进程管理、内存管理、网络编程、Shell脚本和性能调优等方面的经典面试题,希望能够帮助大家在面试中更好地展示自己的技能。

当然,Linux的知识体系非常庞大,本文只是冰山一角。在实际工作中,大家还需要不断学习和积累经验,才能更好地应对各种挑战。

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

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

相关文章

MySQL 缓存机制与架构解析

目录 一、MySQL缓存机制概述 二、MySQL整体架构 三、SQL查询执行全流程 四、MySQL 8.0为何移除查询缓存&#xff1f; 五、MySQL 8.0前的查询缓存配置 六、替代方案&#xff1a;应用层缓存与优化建议 总结 一、MySQL缓存机制概述 MySQL的缓存机制旨在提升数据访问效率&am…

递归练习八(记忆化搜索)

一、解题心得 记忆化搜索就是带着备忘录递归搜索。 函数体设计&#xff1a;进 dfs 后先看看要找的值是不是在备忘录里面存着&#xff0c;有就直接返回&#xff0c;没有再考虑递归出口和中间函数逻辑。 记忆化搜索和递归暴搜都没有很大的关系&#xff0c;而是和动态规划问题有…

uniapp小程序自定义中间凸起样式底部tabbar

我自己写的自定义的tabbar效果图 废话少说咱们直接上代码&#xff0c;一步一步来 第一步&#xff1a; 找到根目录下的 pages.json 文件&#xff0c;在 tabBar 中把 custom 设置为 true&#xff0c;默认值是 false。list 中设置自定义的相关信息&#xff0c; pagePath&#x…

app专项测试(网络测试流程)

一、网络测试的一般流程 step1&#xff1a;首先要考虑网络正常的情况 ① 各个模块的功能正常可用 ② 页面元素/数据显示正常 step2&#xff1a;其次要考虑无网络的情况 ① APP各个功能在无网络情况下是否可用 ② APP各个页面之间切换是否正常 ③ 发送网络请求时是…

【Kubernetes Pod间通信-第3篇】Kubernetes中Pod与ClusterIP服务之间的通信

引言 我们之前了解了在不同场景下,Kubernetes中Pod之间的通信是如何路由的。 【Kubernetes Pod间通信-第1篇】在单个子网中使用underlay网络实现Pod到Pod的通信【Kubernetes Pod间通信-第2篇】使用BGP实现Pod到Pod的通信现在,我们来看看在集群中,Pod与服务之间的通信是如何…

【免费】2007-2019年各省科技支出占一般公共预算支出的比重数据

2007-2019年各省科技支出占一般公共预算支出的比重数据 1、时间&#xff1a;2007-2019年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;行政区划代码、地区名称、年份、科技支出占一般公共预算支出的比重 4、范围&#xff1a;31省 5、指标解释&#xff1a…

【LeetCode】day15 142.环形链表II

142. 环形链表 II - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则…

C基础(六)指针,指针的基础概念、变量定义、运算、大小等

指针&#xff1a; 什么是指针&#xff1a;指针表示内存地址&#xff0c;平时所说的指针一般是保存地址的指针变量。定义指针变量 格式&#xff1a;数据类型 *指针变量名。初始化和赋值&#xff1a;指针指向变量的首地址。定义指针后若未赋值则为野指针&#xff1b;可将变量地址…

【R语言】获取数据

R语言自带2种数据存储格式&#xff1a;*.RData和*.rds。 这两者的区别是&#xff1a;前者既可以存储数据&#xff0c;也可以存储当前工作空间中的所有变量&#xff0c;属于非标准化存储&#xff1b;后者仅用于存储单个R对象&#xff0c;且存储时可以创建标准化档案&#xff0c…

央行发布《贸易金融分布式账本技术要求》,参考架构包括5部分

《银行科技研究社》(作者 木子剑):2024年12月11日,中国人民银行发布金融行业标准《贸易金融分布式账本技术要求》(JR/T 0308-2024)(以下简称“《要求》”),当日实施。据悉,该文件的起草单位包括6大行和多家股份制银行等。 《要求》规定了分布式账本技术在贸易金融领域…

CSS盒模型详解:从零开始理解margin、border、padding

引言 在CSS中&#xff0c;盒模型(Box Model)是一个非常基础且重要的概念。它定义了网页中每个元素如何占据空间以及元素间的关系。今天&#xff0c;我们就通过简单的例子来理解盒模型的构成。 盒模型的组成部分 CSS盒模型主要由四个部分组成&#xff08;从外到内&#xff09…

DS图(中)(19)

文章目录 前言一、图的遍历广度优先遍历深度优先遍历 二、最小生成树Kruskal算法Prim算法两种方法对比 总结 前言 承上启下&#xff0c;我们来学习下图的中篇&#xff01;&#xff01;&#xff01; 一、图的遍历 图的遍历指的是遍历图中的顶点&#xff0c;主要有 广度优先遍历 …

112,【4】攻防世界 web weak_auth

之前做过&#xff0c;回顾 进入靶场 输入admin 123456 不是&#xff0c;这也行&#xff0c;什么闭合方式&#xff0c;注释符都没用上 反而不自然了 不过输入admin 123456 纯属个人习惯 假如我没那么输&#xff0c;或者用户名&#xff0c;密码不是这两个&#xff0c;我该怎…

蓝桥杯更小的数(区间DP)

题目描述 小蓝有一个长度均为 n 且仅由数字字符 0 ∼ 9 组成的字符串&#xff0c;下标从 0 到 n − 1&#xff0c;你可以将其视作是一个具有 n 位的十进制数字 num&#xff0c;小蓝可以从 num 中选出一段连续的子串并将子串进行反转&#xff0c;最多反转一次。小蓝想要将选出的…

109,【1】攻防世界 web 题目名称-文件包含

进入靶场 直接显示源代码 提示我们通过get方式传递名为filename的参数&#xff0c;同时给出了文件名check.php filenamecheck.php 显示使用了正确的用法&#xff0c;错误的方法 filename./check.php 还是一样的回显 傻了&#xff0c;题目名称是文件包含&#xff0c;需要用到…

71.StackPanel黑白棋盘 WPF例子 C#例子

就是生成黑白棋盘&#xff0c;利用该控件能自动排列的功能。用一个横向的StackPanel嵌套纵向的StackPanel&#xff0c;然后在里面添加设定好长和高的矩形。 因为StackPanel是按照控件的大小展示的。所以如果不设置长和宽。就会显示不出矩形。 <StackPanel Orientation"…

DeepSeek之python实现API应用

先创建一个API KEY https://platform.deepseek.com/api_keys python脚本实现 # Please install OpenAI SDK first: `pip3 install openai`from openai import OpenAIclient = OpenAI(api_key="", base_url="https://api.deepseek.com")response = cli…

MySQL中like模糊查询如何优化?

大家好&#xff0c;我是锋哥。今天分享关于【MySQL中like模糊查询如何优化&#xff1f;】面试题。希望对大家有帮助&#xff1b; MySQL中like模糊查询如何优化&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在MySQL中&#xff0c;LIKE模糊查询通常会影…

通过docker安装部署deepseek以及python实现

前提条件 Docker 安装:确保你的系统已经安装并正确配置了 Docker。可以通过运行 docker --version 来验证 Docker 是否安装成功。 网络环境:保证设备有稳定的网络连接,以便拉取 Docker 镜像和模型文件。 步骤一:拉取 Ollama Docker 镜像 Ollama 可以帮助我们更方便地管理…

制作PE启动盘(内含Win11 iso镜像)

前言 本文用于记录制作PE启动盘过程&#xff0c;学习记录用&#xff0c;如有不对请指出&#xff0c;谢谢&#xff01; 参考视频&#xff1a; 1. 微PE下载&#xff1a;https://www.bilibili.com/video/BV1vT4y1n7JX/?spm_id_from333.788.top_right_bar_window_history.conte…