在 Linux 中,“进程如何启动”可以从用户视角和内核视角两个层面来理解。下面用由浅入深的方式说明。
在终端输入一个命令:
ls
背后发生了什么?
fork() 创建一个子进程exec() 系列函数(如 execve())加载 /bin/ls/bin/ls 的内容替换子进程的内存空间ls 开始执行✅ 本质:fork + exec
./my_program
前提:
chmod +x my_program./test.sh
脚本第一行决定解释器:
#!/bin/bash
执行流程:
/bin/bash)pid_t pid = fork();
作用:
⚠️ fork() 之后,父子进程代码相同,但返回值不同:
pid > 0pid == 0execve("/bin/ls", argv, envp);
作用:
常见变体:
execlexecpexecvpid_t pid = fork();
if (pid == 0) {
// 子进程
execl("/bin/ls", "ls", NULL);
} else {
// 父进程
wait(NULL);
}
ls
task_structmain(argc, argv, envp)特点:
systemd启动方式:
nohup / setsidcron
systemd timer
ps -ef
ps aux
cat /proc/<pid>/cmdline
ps -o lstart -p <pid>
✅ Linux 启动进程的本质是:
fork() 创建进程 + exec() 加载程序
✅ 所有进程的最终来源:
init / systemd → fork → exec
如果你愿意,我可以继续讲:
你想深入哪一块?