【Linux系统编程介绍】

📅 发布时间:2026/7/4 13:17:55 👁️ 浏览次数:
【Linux系统编程介绍】
文章目录一、Linux 系统编程是什么二、必备环境与工具1. 环境2. 常用编译选项三、基础系统调用快速回顾1. 文件 I/O2. 进程控制3. 信号4. 线程用户态库四、进程间通信IPC综述五、文件描述符与 I/O 多路复用一、Linux 系统编程是什么Linux 系统编程指的是使用 C/C与 POSIX/Linux 提供的 API系统调用库来实现与内核交互的程序。核心点有使用系统调用open,read,write,fork,exec,socket等直接操作资源。理解文件描述符、权限、阻塞/非阻塞模式。进程/线程管理与信号处理。网络编程BSD sockets。高性能 I/Oselect/poll/epoll。进程间通信管道、FIFO、共享内存、消息队列、socketpair。调试与性能分析工具strace,gdb,valgrind等。二、必备环境与工具1. 环境Linux任意主流发行版如 Ubuntu, CentOS, Debian。编译器gcc/clang。推荐gcc。开发工具make、gdb、strace、valgrind、ncnetcat用于测试网络。2. 常用编译选项# 基本编译gcc-Wall-Wextra-O2-omyprog myprog.c# 带调试信息gcc-g-Wall-Wextra-O0-omyprog_debug myprog.c# 链接 pthread线程gcc-pthread-omythread prog.c三、基础系统调用快速回顾1. 文件 I/Oopen,read,write,close,lseek。推荐使用pread/pwrite在多线程/异步场景下避免移动文件指针竞态。示例读取文件前 100 字节#includefcntl.h#includeunistd.h#includestdio.h#includestdlib.hintmain(void){intfdopen(test.txt,O_RDONLY);if(fd0){perror(open);return1;}charbuf[101]{0};ssize_tnread(fd,buf,100);if(n0){perror(read);close(fd);return1;}printf(read %zd bytes: %s\n,n,buf);close(fd);return0;}2. 进程控制fork(),execve()及execlp等封装),waitpid()。fork()返回两次父进程得到子 pid子进程得到 0。注意资源复制写时复制 COW。示例fork 后 exec 一个新程序#includeunistd.h#includesys/wait.h#includestdio.hintmain(){pid_tpidfork();if(pid0){// childexeclp(ls,ls,-l,NULL);_exit(1);}else{// parentwaitpid(pid,NULL,0);printf(child finished\n);}}3. 信号signal()/sigaction()异步事件。避免在信号处理函数中做非可重入操作sigprocmask()管理阻塞信号。4. 线程用户态库pthread_create、pthread_join、互斥/条件变量。四、进程间通信IPC综述无名管道pipe()父子通信常用。命名管道FIFO持久化的管道。Unix domain socketAF_UNIX进程间比 TCP 更高效的 socket。共享内存shm_open/mmap最快但需要同步机制。消息队列System V 或 POSIX mq。示例创建无名管道并写入#includeunistd.h#includestdio.h#includestring.hintmain(){intfds[2];pipe(fds);pid_tpidfork();if(pid0){close(fds[1]);charbuf[100];read(fds[0],buf,sizeof(buf));printf(child received: %s\n,buf);}else{close(fds[0]);constchar*msghello from parent;write(fds[1],msg,strlen(msg)1);}return0;}五、文件描述符与 I/O 多路复用典型场景高并发网络服务器需要同时处理大量 socket。常用模型select()老旧fd 数量受限FD_SETSIZE。poll()可扩展到较大数量但遍历开销 O(n)。epollLinux 专用事件驱动O(1) 级别性能适合高并发。