Linux 系统编程 进程篇 (五)

进程基础概念

在Linux系统中,进程是程序执行的实例,每个进程拥有独立的地址空间、资源和执行状态。内核通过进程描述符(task_struct结构体)管理进程信息。

进程标识符(PID)是唯一标识进程的数字,父进程标识符(PPID)表示创建该进程的父进程。通过getpid()getppid()系统调用可获取当前进程的PID和PPID。

进程创建与终止

进程创建

通过fork()系统调用创建子进程,子进程复制父进程的代码段、数据段和堆栈。fork()返回两次:

  • 父进程中返回子进程PID
  • 子进程中返回0
c 复制代码
#include <unistd.h>
pid_t fork(void);

进程终止

正常终止方式包括:

  • 调用exit()_exit()函数
  • main()函数返回
  • 接收到终止信号

exit()会执行标准I/O清理和退出处理程序,而_exit()直接终止进程。

进程间通信(IPC)

管道(Pipe)

匿名管道用于父子进程通信,通过pipe()创建:

c 复制代码
int pipe(int fd[2]);

共享内存

通过shmget()创建共享内存段,shmat()附加到进程地址空间:

c 复制代码
int shmget(key_t key, size_t size, int shmflg);
void *shmat(int shmid, const void *shmaddr, int shmflg);

信号(Signal)

使用kill()发送信号,signal()sigaction()设置信号处理程序:

c 复制代码
int kill(pid_t pid, int sig);
void (*signal(int sig, void (*func)(int)))(int);

进程状态管理

进程状态

Linux进程主要状态包括:

  • 运行(TASK_RUNNING)
  • 可中断等待(TASK_INTERRUPTIBLE)
  • 不可中断等待(TASK_UNINTERRUPTIBLE)
  • 停止(TASK_STOPPED)
  • 僵尸(TASK_ZOMBIE)

进程调度

通过nice()调整进程优先级,sched_setscheduler()设置调度策略:

c 复制代码
int nice(int inc);
int sched_setscheduler(pid_t pid, int policy, const struct sched_param *param);

守护进程

守护进程是在后台运行的独立进程,创建步骤包括:

  1. 调用fork()创建子进程,父进程退出
  2. 调用setsid()创建新会话
  3. 改变工作目录到根目录
  4. 重设文件权限掩码
  5. 关闭继承的文件描述符
c 复制代码
pid_t pid = fork();
if (pid > 0) exit(0);
setsid();
chdir("/");
umask(0);
for (int i = 0; i < sysconf(_SC_OPEN_MAX); i++) close(i);

进程监控

进程列表

通过ps命令查看进程信息,或编程方式读取/proc文件系统:

c 复制代码
DIR *dir = opendir("/proc");
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
    if (isdigit(entry->d_name[0])) {
        printf("PID: %s\n", entry->d_name);
    }
}
closedir(dir);

进程资源
getrusage()获取进程资源使用情况:

c 复制代码
int getrusage(int who, struct rusage *usage);
相关推荐
XIAOHEZIcode2 小时前
Ubuntu 终端美化全栈指南:Bash 到 Kitty 踩坑实录
linux·ubuntu·命令行
亦暖筑序2 小时前
Java 8老系统AI Workflow实战:把一次性AI对话升级成可恢复工作流
java·后端
敲代码的彭于晏3 小时前
Bean 生命周期完全图解:前端同学也能看懂的 Spring 核心机制
java·前端·后端
plainGeekDev4 小时前
ButterKnife → ViewBinding
android·java·kotlin
唐青枫4 小时前
别再只会用 cron:Linux systemd Timer 定时任务实战详解
linux
像我这样帅的人丶你还20 小时前
Java 后端详解(四):分页与搜索
java·javascript·后端
她的男孩20 小时前
数据权限为什么不能只靠注解?Forge 的 Mapper 层 SQL 改写源码拆解
java·后端·架构
tntxia21 小时前
Mybatis的日志输入
java
亦暖筑序1 天前
Java 8老系统Browser Agent实战:三层拦截把AI操作后台变成可审计流程
java·后端·设计模式
用户298698530141 天前
Java 实现 Word 文档加密与权限解除
java·后端