嵌入式学习(18)---Linux文件编程中的进程
- 电脑硬件
- 2025-08-26 14:45:02

一、进程的概念
进程:(用来描述 程序动态执行的过程,方便操作系统管理的) 进行中的程序 程序的一次执行过程 (内存 + CPU) 程序的实例 程序 ----加载到内存----> 进程
应用场景: 实现并发 同一时刻 同时发生 并行 一并前行
进程 的组成: 进程怎么来的? 程序 ---- 加载到内存 ----> 进程 程序的组成: 程序 = 代码 + 数据 程序 = 代码区 + [栈|堆|全局区|字符串常量区]
进程 = 代码|data|bss|堆|栈 + pcb //pcb (process control block) 进程控制块
pcb的组成: struct task_struct { PID, //进程标识符 PPID, //父进程ID号 parent 当前工作路径 //chdir umask //0002 进程打开的文件列表 //文件IO中有提到 信号相关设置 //处理异步io, ---段错误 用户id,组id 进程资源的上限 }
进程的调度算法 1.公平 效率 2.时间片轮转 3.先来先服务
进程的状态:
PROCESS STATE CODES Here are the different values that the s, stat and state output specifiers (header "STAT" or "S") will display to describe the state of a process:
D uninterruptible sleep (usually IO) //不可中断的睡眠态 R running or runnable (on run queue) // 运行态 S interruptible sleep (waiting for an event to complete)//可中断的睡眠态 T stopped by job control signal // 暂停态 t stopped by debugger during the tracing W paging (not valid since the 2.6.xx kernel) X dead (should never be seen) Z defunct ("zombie") process, terminated but not reaped by its parent
For BSD formats and when the stat keyword is used, additional characters may be displayed:
< high-priority (not nice to other users) N low-priority (nice to other users) L has pages locked into memory (for real-time and custom IO) s is a session leader l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do) + is in the foreground process group
R --- 运行态 D --- 不可中断 睡眠态 S --- 可中断 睡眠态 T --- 暂停态 Z --- 僵尸态
二、进程管理的命令及运用 1、进程管理的命令top //类似Windows的下任务管理器
ps -eLf | head -1 //可以观察到 PID PPID等 eg:
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
ps -eLf | grep a.out //查看a.out 信息 //可以观察到 PID PPID ps -aux | grep a.out //可以查看进程 的状态
pstree //进程树
pstree -sp pid号 //查看指定的进程的关系
kill //给进程发信号 kill + 信号 + 程序的pid号 eg: kill -9 5266 kill -l //查看可以发送的信号
2、进程的运用linux下编程 使用进程: 1.创建 2.进行运行 3.进程结束
1.创建 fork()
pid_t fork(void); 功能: 创建子进程 (通过复制调用进程) 参数: void 返回值: 成功 在父进程中 返回子进程的pid号 在子进程中 返回0 失败 -1 && errno 被设置 pid号: pid 本质上就是一个数值 正整数 1
叉子 一次调用,会返回两次。 子进程先运行和是父进程先进程,顺序不确定。 变量不共享。 子进程复制父进程的0到3g空间和父进程内核中的PCB,但id号不同。 此时,父子进程各自拥有独立的4g内存空间 (32位的系统) 功能: 通过该函数可以从当前进程中克隆一个同名新进程。 克隆的进程称为子进程,原有的进程称为父进程。 子进程是父进程的完全拷贝。 复制之后, 子进程和父进程各自拥有自己的用户空间(进程空间) 子进程和父进程的执行过程是从fork函数之后执行。 子进程与父进程具有相同的代码逻辑。 返回值:int 类型的数字。 在父进程中:成功 返回值是子进程的pid号 >0 失败 返回-1; 在子进程中:成功 返回值 0 失败 无 注意: 1.创建好之后,父子进程的运行顺序是不确定 ---全部取决于操作系统的调度 2.他们的数据相互独立,父进程或子进程对数据的修改,不会相互影响,只会对各自造成影响
操作: 将父进程杀死 //使用kill停止父进程 init进程(1) //UNIX环境高级编程(init -- systemd) init(1)───gnome-terminal-(2554)───bash(3336)───a.out(5934)───a.out(5935)
杀死父进程: init(1)───a.out(5935)
子进程还在 ,父进程不在 ---- 孤儿进程 ---- 此时由init进程 收养 结束子进程,父进程还在,但是父进程并没有对子进程"收尸",会占用硬盘空间 特殊: 孤儿进程 子进程 还在,父进程不在 僵尸进程 子进程 结束,父进程还在,且父进程并未"收尸" 僵尸态进程有危害
eg:创建n个子进程
嵌入式学习(18)---Linux文件编程中的进程由讯客互联电脑硬件栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“嵌入式学习(18)---Linux文件编程中的进程”