CentOS C++面试题及答案
导读:CentOS C++面试题及答案(聚焦系统级与核心知识点) 以下题目结合CentOS系统特性(如进程/线程管理、内存布局、网络编程)与C++核心知识点,覆盖面试高频考点及实用场景。 1. CentOS下如何查看C++程序的内存泄漏?请给出具...
CentOS C++面试题及答案(聚焦系统级与核心知识点)
以下题目结合CentOS系统特性(如进程/线程管理、内存布局、网络编程)与C++核心知识点,覆盖面试高频考点及实用场景。
1. CentOS下如何查看C++程序的内存泄漏?请给出具体命令与工具
答案:
在CentOS中,可通过Valgrind工具检测C++程序的内存泄漏。常用命令如下:
valgrind --leak-check=full ./your_program
--leak-check=full:显示详细的泄漏信息(包括泄漏位置、内存地址、调用栈)。- 输出结果中,
definitely lost表示确认的内存泄漏(未释放的堆内存),indirectly lost表示间接泄漏(如结构体成员未释放)。 - 补充:若程序依赖动态库,需通过
LD_LIBRARY_PATH指定库路径,例如:valgrind --leak-check=full LD_LIBRARY_PATH=/usr/local/lib ./your_program
2. CentOS系统调用fork()与C++多进程编程:如何避免僵尸进程?
答案:
fork()创建的子进程结束后,若父进程未调用wait()或waitpid()回收其退出状态,子进程会变成僵尸进程(占用进程ID但无资源)。
解决方法:
- 方法1:父进程调用
wait(NULL)阻塞等待子进程结束:#include < sys/wait.h> #include < unistd.h> int main() { pid_t pid = fork(); if (pid == 0) { // 子进程 printf("Child process\n"); exit(0); } else if (pid > 0) { // 父进程 wait(NULL); // 等待子进程结束 printf("Child exited\n"); } return 0; } - 方法2:父进程忽略
SIGCHLD信号(子进程退出时发送),内核会自动回收僵尸进程:signal(SIGCHLD, SIG_IGN); - 注意:在CentOS中,僵尸进程不会立即消失,需通过
ps aux | grep 'Z'查看,若长期存在需重启服务或修复代码。
3. CentOS下C++多线程同步:pthread_mutex_t与std::mutex的区别
答案:
pthread_mutex_t:POSIX线程库提供的互斥锁,需手动初始化(pthread_mutex_init)与销毁(pthread_mutex_destroy),适用于C++11前的多线程编程。#include < pthread.h> pthread_mutex_t mutex; pthread_mutex_init(& mutex, NULL); // 初始化 pthread_mutex_lock(& mutex); // 加锁 // 临界区代码 pthread_mutex_unlock(& mutex); // 解锁 pthread_mutex_destroy(& mutex); // 销毁std::mutex:C++11标准库提供的互斥锁,无需手动管理生命周期,支持RAII(如std::lock_guard自动加锁/解锁),更安全。#include < mutex> std::mutex mtx; { std::lock_guard< std::mutex> lock(mtx); // 自动加锁 // 临界区代码 } // 自动解锁- CentOS兼容性:两者均可在CentOS中使用,但
std::mutex是C++标准,跨平台性更好,推荐优先使用。
4. CentOS下C++动态库(.so文件)的编译与使用
答案:
- 编译动态库:将
hello.cpp编译为libhello.so:g++ -shared -fPIC hello.cpp -o libhello.so-shared:生成动态库;-fPIC:生成位置无关代码(动态库加载时无需固定地址)。
- 使用动态库:编写
main.cpp调用动态库中的函数,编译时指定库路径:g++ main.cpp -L. -lhello -o main-L.:指定库路径为当前目录;-lhello:链接libhello.so(省略lib前缀与.so后缀)。
- 运行程序:需将动态库路径加入
LD_LIBRARY_PATH环境变量:export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ./main - CentOS系统目录:动态库也可安装到
/usr/lib或/usr/local/lib,无需修改LD_LIBRARY_PATH。
5. CentOS下C++程序如何捕获信号(如SIGSEGV)?
答案:
使用signal()或sigaction()函数捕获信号,例如捕获SIGSEGV(段错误)并打印堆栈:
#include <
signal.h>
#include <
execinfo.h>
#include <
iostream>
#include <
unistd.h>
void signal_handler(int sig) {
void* array[10];
size_t size = backtrace(array, 10);
// 获取堆栈信息
std::cerr <
<
"Error: signal " <
<
sig <
<
std::endl;
backtrace_symbols_fd(array, size, STDERR_FILENO);
// 打印堆栈到标准错误
exit(1);
}
int main() {
signal(SIGSEGV, signal_handler);
// 注册信号处理函数
int* p = nullptr;
*p = 10;
// 触发段错误
return 0;
}
- 说明:
backtrace()获取堆栈帧地址,backtrace_symbols_fd()将地址转换为可读的函数名与行号(需编译时加-rdynamic选项)。 - CentOS调试:可通过
gdb进一步分析core dump文件(需开启ulimit -c unlimited)。
6. CentOS下C++文件IO:open()与fopen()的区别
答案:
open():POSIX系统调用,返回文件描述符(整数),支持底层操作(如read()、write()),适用于高性能场景。#include < fcntl.h> #include < unistd.h> int fd = open("test.txt", O_WRONLY | O_CREAT, 0644); // 打开/创建文件 write(fd, "Hello, CentOS!", 14); // 写入数据 close(fd); // 关闭文件fopen():C标准库函数,返回FILE*指针,支持缓冲IO(如fprintf()、fscanf()),适用于常规文件操作。#include < cstdio> FILE* fp = fopen("test.txt", "w"); // 打开文件 fprintf(fp, "Hello, CentOS!"); // 写入数据 fclose(fp); // 关闭文件- CentOS差异:
open()更底层,性能更高,但需手动处理缓冲;fopen()更易用,适合大多数场景。
7. CentOS下C++如何实现进程间通信(IPC)?请列举常用方法
答案:
CentOS下C++常用的IPC方法包括:
- 管道(Pipe):用于父子进程通信,分为匿名管道(
pipe())和命名管道(mkfifo())。int fd[2]; pipe(fd); // 创建匿名管道 if (fork() == 0) { // 子进程 close(fd[0]); // 关闭读端 write(fd[1], "Hello", 6); } else { // 父进程 close(fd[1]); // 关闭写端 char buf[10]; read(fd[0], buf, 10); std::cout < < "Received: " < < buf < < std::endl; } - 共享内存(Shared Memory):多个进程共享同一块内存,需配合信号量同步(
semaphore)。#include < sys/ipc.h> #include < sys/shm.h> int shmid = shmget(IPC_PRIVATE, 1024, IPC_CREAT | 0666); // 创建共享内存 char* shm = (char*)shmat(shmid, NULL, 0); // 映射到进程地址空间 strcpy(shm, "Hello from Process 1!"); shmdt(shm); // 解除映射 shmctl(shmid, IPC_RMID, NULL); // 删除共享内存 - 消息队列(Message Queue):通过消息类型实现进程间通信,
msgget()创建队列,msgsnd()发送消息,msgrcv()接收消息。 - 信号量(Semaphore):用于进程同步,
semget()创建信号量,semop()操作信号量(如P/V操作)。
8. CentOS下C++程序的性能分析:如何使用gprof?
答案:
gprof是GNU性能分析工具,用于统计函数调用次数与耗时,步骤如下:
- 编译时添加
-pg选项:生成带分析信息的可执行文件。g++ -pg your_program.cpp -o your_program - 运行程序:生成
gmon.out文件(包含性能数据)。./your_program - 分析性能:使用
gprof生成报告。gprof your_program gmon.out > analysis.txt - 报告内容:包含函数调用图、每个函数的调用次数、执行时间占比(如
%time、self time)。 - CentOS注意:
gprof仅支持单线程程序,多线程程序需使用perf工具(perf record、perf report)。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: CentOS C++面试题及答案
本文地址: https://pptw.com/jishu/736416.html
