在 Linux 中,进程的启动和运行涉及 内核调度、系统调用、可执行文件格式、进程状态 等多个方面。下面从 用户视角 → 系统调用 → 内核机制 逐步说明。
ls
./my_program
执行流程:
fork() 创建子进程exec() 加载新程序pid_t pid = fork();
作用:
返回值:
fork 之后,子进程几乎完全复制父进程(但写时复制 COW)
execve("/bin/ls", argv, envp);
作用:
常见变体:
execl, execv, execle, execvp, execvpe
exec 成功后,不会返回
pid_t pid = fork();
if (pid == 0) {
// 子进程
execve("./app", args, env);
} else {
// 父进程
waitpid(pid, &status, 0);
}
Linux 常用 ELF(Executable and Linkable Format)
ELF 包含:
查看:
file a.out
readelf -h a.out
_start)创建 → 就绪 → 运行 → 阻塞 → 终止
查看:
ps -eo pid,stat,cmd
常见状态:
R 运行中 / 就绪S 可中断睡眠D 不可中断睡眠Z 僵尸进程T 停止shell
↓
fork()
↓
子进程
↓
execve()
↓
加载 ELF
↓
跳转到 _start
↓
__libc_start_main
↓
main()
↓
exit()
↓
进程终止
pthread_create()
ps aux
top
htop
strace ./app
lsof -p PID
cat /proc/PID/maps
Linux 进程通过 fork 创建、exec 加载程序、由内核调度在 CPU 上运行。
如果你愿意,我可以:
你想深入哪一部分?