没有合适的资源?快使用搜索试试~ 我知道了~
首页Linux进程编程基础:定义、状态与调度详解
Linux进程编程基础:定义、状态与调度详解
需积分: 10 0 下载量 166 浏览量
更新于2024-07-26
收藏 987KB PDF 举报
Linux进程编程基础深入讲解了进程在操作系统中的核心地位及其工作原理。首先,进程被定义为一个具有独立功能的程序,针对特定数据集执行并发操作的活动。它是操作系统的基本构建单元,既独立于其他进程执行,又是资源争夺的核心。理解进程的概念有助于设计和管理操作系统,并在编写复杂的程序时提供指导。 进程的生命历程中,存在着多种状态,每个状态都有其独特含义。1.1进程状态包括用户状态,当进程在用户空间运行时;内核状态分为两种,一是进程在内核空间处理硬件资源或执行系统服务,二是执行过程中临时进入内核,然后返回用户状态。就绪状态表示进程准备好执行,可能在内存或交换设备中。睡眠状态意味着进程暂时休眠,可能因等待I/O完成或其他事件的发生。还有被抢先状态,当进程被其他更优先级的任务中断时,它会转为这种状态。 创建状态是新创建的进程初始状态,而僵死状态(zombie)则出现在进程调用exit退出后,虽已不存在但仍保留在进程表中,直到父进程回收。进程从创建到退出的过程中,可能会经历多种状态转换,如通过fork创建子进程时,子进程先变为创建状态,随后根据内存情况转变为就绪或睡眠状态。 进程的生命周期并非固定模式,内核调度器负责决定何时将进程调度到CPU执行,这涉及内存管理、优先级控制等多方面因素。掌握这些基本概念和状态转换,对Linux进程编程至关重要,无论是开发多任务应用、优化性能还是调试问题,都是不可或缺的基础知识。
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/5098902/bge.jpg)
东东整理
Linux 进程编程介绍
13
#include <sys/wait.h>
发出wait 调用的进程进入睡眠直到它的一个子进程退出时或收到一个不能被忽略的信号时被唤醒。如
果调用发出时,已经有退出的子进程(这时子进程的状态是僵死状态),该调用立即返回。其中调用返回
时参数 status 中包含子进程退出时的状态信息。
调用waitpid 与调用 wait 的区别是 waitpid 等待由参数 pid 指定的子进程退出。其中参数 pid 的含义与
取值方法如下:
1) 参数 pid < -1 时,当退出的子进程满足下面条件时结束等待:该子进程的进程组 ID(process group)
等于绝对值的 pid 这个条件。
2) 参数 pid = 0 时,等待任何满足下面条件的子进程退出:该子进程的进程组 ID 等于发出调用进程的
进程组 ID。
3) 参数 pid > 0 时,等待进程 ID 等于参数 pid 的子进程退出。
4) 参数 pid = -1 时,等待任何子进程退出,相当于调用 wait。
对于调用 waitpid 中的参数 options 的取值及其含义如下:
WNOHANG:该选项要求如果没有子进程退出就立即返回。
WUNTRACED:对已经停止但未报告状态的子进程,该调用也从等待中返回和报告状态。
如果 status 不是空,调用将使 status 指向该信息。下面的宏可以用来检查子进程的返回状态。前面三
个用来判断退出的原因,后面三个是对应不同的原因返回状态值:
1) WIFEXITED(status):如果进程通过系统调用_exit 或函数调用 exit 正常退出,该宏的值为真。
2) WIFSIGNALED(status):如果子进程由于得到的信号(signal)没有被捕捉而导致退出时,该宏的值
为真。
3) WIFSTOPPED(status)
:如果子进程没有终止,但停止了并可以重新执行时,该宏返回真。这种情况
仅出现在 waitpid 调用中使用了 WUNTRACED 选项。
4) WEXITSTATUS(status):如果 WIFEXITED(status)返回真,该宏返回由子进程调用_exit(status)或
exit(status)时设置的调用参数 status 值。
5) WTERMSIG(status):如果 WIFSIGNALED(status)返回为真,该宏返回导致子进程退出的信号(signal)
的值。
6) WSTOPSIG(status):如果 WIFSTOPPED(status)返回真,该宏返回导致子进程停止的信号(signal)
值。
该调用返回退出的子进程的 PID;或者发生错误时返回-1;或者设置了 WNOHANG 选项没有子进程
退出就返回 0;发生错误时,可能设置的错误代码如下:
ECHILD:该调用指定的子进程 pid 不存在,或者不是发出调用进程的子进程。
EINVAL:参数 options 无效。
ERESTARTSYS:WNOHANG 没有设置并且捕获到 SIGCHLD 或其它未屏蔽信号。
关于wait 调用的例子,前面在介绍 fork 调用时,就有了简单的应用。此处不再举例。
![](https://csdnimg.cn/release/download_crawler_static/5098902/bgf.jpg)
东东整理
Linux 进程编程介绍
14
注意:子进程退出(SIGCHLD)信号设置不同的处理方法,会导致该调用不同的行为,详细情况见
Linux 信号处理机制。
2.5 sleep 函数调用
函数调用 sleep
①
可以用来使进程挂起指定的秒数。该函数调用的声明格式如下:
unsigned int sleep(unsigned int seconds)
在使用这个函数调用的程序中加上以下的头文件:
#include <unistd.h>
该函数调用使得进程挂起一个指定的时间,直到指定时间用完或者收到信号
。系统的活动对指定的时
间有一定的影响。Linux 系统是用 SIGALRM 实现的,在 Linux 系统里,sleep 函数不能和 alarm()调用混用。
如果指定挂起的时间到了,该调用返回 0;如果该函数调用被信号所打断,则返回剩余挂起的时间数
(指定的时间减去已经挂起的时间)。
①
更精确的休眠时间使用 usleep,单位是微秒。
![](https://csdnimg.cn/release/download_crawler_static/5098902/bg10.jpg)
东东整理
Linux 进程编程介绍
15
第三章 进程的特殊操作
摘要:本节要介绍一些有关进程的特殊操作。有了这些操作,就使得进程的编程更加完善,能编制更
为实用的程序。主要的内容有得到关于进程的各种 ID、对进程的设置用户 ID、改变进程的工作目录、改
变进程的根、改变进程的优先权值等操作。
3.进程的特殊操作
上一节介绍了有关进程的一些基本操作,如进程的产生(fork)、进程的终止(exit)、进程执行映像的
改变(exec)、等待子进程终止(wait)等。本节要介绍一些有关进程的特殊操作。有了这些操作,就使得
进程的编程更加完善,能编制更为实用的程序。
主要的内容有得到关于进程的各种 ID、对进程的设置用户 ID、改变进程的工作目录、改变进程的根、
改变进程的优先权值等操作。
3.1 获得进程相关的 ID
与进程相关的 ID 有:
1) 真正用户标识号(UID):该标识号负责标识运行进程的用户。
2) 有效用户标识号(EUID):该标识号负责标识以什么用户身份来给新创建的进程赋所有权、检查文
件的存取权限和检查通过系统调用 kill 向进程发送软中断信号的许可权限。
3) 真正用户组标识号(GID):负责标识运行进程的用户所属的组 ID。
4) 有效用户组标识号(EGID):用来标识目前进程所属的用户组。可能因为执行文件设置 set-gid 位而
与 gid 不同。
5) 进程标识号(PID):用来标识进程。
6) 进程组标识号(process group ID):一个进程可以属于某个进程组。可以发送信号给一组进程。注意,
它不同与 gid。前面的系统调用
wait 中指定参数 pid 时,就用到了进程组的概念。
如果要获得进程的用户标识号,用 getuid 调用。调用 geteuid 是用来获得进程的有效用户标识号。有
效用户 ID 与真正用户 ID 的不同是由于执行文件设置 set-uid 位引起的。这两个调用的格式如下:
uid_t getuid(void);
uid_t geteuid(void);
在使用这两个调用的程序中加入下列头文件:
#include <unistd.h>
#include <sys/types.h>
如果要获得运行进程的用户组 ID,使用 getgid 调用来获得真正的用户组 ID,用 getegid 获得有效的用
户组 ID。标识 gid 与 egid 的不同是由于执行文件设置 set-gid 位引起的。这两个调用的格式如下:
![](https://csdnimg.cn/release/download_crawler_static/5098902/bg11.jpg)
东东整理
Linux 进程编程介绍
16
gid_t getgid(void);
gid_t getegid(void);
在使用这两个调用的程序中加入下列头文件:
#include <unistd.h>
#include <sys/types.h>
如果要获得进程的 ID,使用 getpid 调用;要获得进程的父进程的 ID,使用 getppid 调用。这两个调用
的格式如下:
pid_t getpid(void);
pid_t getppid(void);
在使用这两个调用的程序中加入下列头文件:
#include <unistd.h>
如果要获得进程所属组的 ID,使用 getpgrp 调用;若要获得指定 PID 进程所属组的 ID 用 getpgid 调用。
这两个调用的格式如下:
pid_t getpgrp(void);
pid_t getpgid(pid_t pid);
在使用这两个调用的程序中加入下列头文件:
#include <unistd.h>
注意一下 gid 和 pgrp 的区别,一般执行该进程的用户的组 ID 就是该进程的 gid,如果该执行文件设置
了 set_gid 位,则文件所属的组 ID 就是该进程的 gid。对于进程组 ID,一般来说,一个进程在 shell 下执行,
shell 程序就将该进程的 PID 赋给该进程的进程组 ID
,从该进程派生的子进程都拥有父进程所属的进程组
ID,除非父进程将子进程的所属组 ID 设置成与该子进程的 PID 一样。由于这几个调用使用很简单,这里
就不再举例。
3.2 setuid 和 setgid 系统调用
前面讲述了如何得到 uid 和 gid,现在来看看如何设置它们。在讲述这两个调用以前我们先来看看对文
件设置 set_uid 位会有什么作用。我们先编了一个小程序来做试验。这个程序的作用是,打印出进程的 uid
和 euid,然后打开一个名为 tty.c 的文件。如果打不开,就显示错误代码;如果打开了,就显示打开成功。
假设该程序名叫 uid_test.c:
/* uid_test.c */
#include <sys/types.h>
#include <sys/stat.h>
剩余81页未读,继续阅读
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![text/x-c](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/default.jpg!1)
elotent
- 粉丝: 0
- 资源: 13
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- 构建Cadence PSpice仿真模型库教程
- VMware 10.0安装指南:步骤详解与网络、文件共享解决方案
- 中国互联网20周年必读:影响行业的100本经典书籍
- SQL Server 2000 Analysis Services的经典MDX查询示例
- VC6.0 MFC操作Excel教程:亲测Win7下的应用与保存技巧
- 使用Python NetworkX处理网络图
- 科技驱动:计算机控制技术的革新与应用
- MF-1型机器人硬件与robobasic编程详解
- ADC性能指标解析:超越位数、SNR和谐波
- 通用示波器改造为逻辑分析仪:0-1字符显示与电路设计
- C++实现TCP控制台客户端
- SOA架构下ESB在卷烟厂的信息整合与决策支持
- 三维人脸识别:技术进展与应用解析
- 单张人脸图像的眼镜边框自动去除方法
- C语言绘制图形:余弦曲线与正弦函数示例
- Matlab 文件操作入门:fopen、fclose、fprintf、fscanf 等函数使用详解
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)