系统编程(程序与进程,进程操作API)
一、什么是程序,什么是进程
1.程序:一堆待执行的代码,称之为程序
2.进程:当程序被CPU加载后,程序中一行行代码被执行,形成一个动态的过程,即一个正在执行的程序
3.如何执行一个进程:即执行程序,如执行hello,即./hello
4.进程在系统中如何存储:以结构体的形式进行存储,结构体中存放该进程的一些相关信息,可通过ps -ef查看进程相关信息
二、如何查看当前系统进程
1.输入ps -ef查看
可以查看到当前系统内进程的各项信息,例如:进程的使用者(权限归属),进程id,该进程的父进程id,CPU占用空间,启动时间,持续时间,启动命令,如下图所示(ubuntu下执行)
2.输入pstree查看系统中各个进程之间的关系
三、进程的状态
1.进程有如下六种状态
1)就绪态:不运行代码,不占用CPU
2)睡眠态/挂起态:不运行代码,占用CPU
3)暂停态:不运行代码,占用CPU
4)运行态:运行代码,占用CPU
5)僵尸态:不运行代码,占用CPU,进程结束后会进入僵尸态,需要被父进程回收进入死亡态
6)死亡态:不运行代码,不占用CPU,进程退出后,父进程回收子进程资源,子进程变为死亡态
僵尸态:进程资源未被回收,尽管进程结束,但是依旧占用着CPU资源
僵尸进程:当父进程被挂起或暂停时(或是陷入死循环),子进程比父进程先结束,此时子进程为僵尸进程(即僵尸态)
孤儿进程:当父进程比子进程先结束,此时子进程会变为孤儿进程,祖先进程会成为孤儿进程的父进程,回收该孤儿进程
四、进程API
1.fork函数
函数头文件:
#define <unistd.h>
函数体:
pid_t fork(void);
返回值:(一次调用,两次返回)
成功返回:>0 该进程为父进程,返回值为子进程id
== 0 该进程为子进程
失败返回:-1
示例1:
int main()
{printf("main:%d\n",getpid());pid_t id = fork();if(id < 0){printf("fork error\n");return -1;}else if(id > 0)//父进程{printf("father process:%d,son:%d\n",getpid(),id);}else if(id == 0)//子进程{printf("son process:%d\n",getpid());}return 0;
}
以上示例用到了函数getpid(),用于获取当前进程的id号,在本文后面会有详解。
该程序输出结果如下
由此可验证
父进程的中返回的id为子进程的id号。
2.getpid(),getppid().
头文件:
#include <sys/types.h>
#include <unistd.h>
函数体:
1)pid_t getpid(void) 获取当前进程的id号
2)pid_t getppid(void)获取当前进程父进程的id号
返回值
成功返回:id号
该函数只会成功
示例如示例1所示
3.exit(int status)、_exit(int status)和_Exit(int status)
头文件:
#include <unistd.h>
#include <stdlib.h>
函数体:
void exit(int status);
void _exit(int status);
void _Exit(int status);
函数作用:
退出当前进程,并可以将当前进程的退出状态传输给父进程
参数:
status,可以设置当前进程的退出值,让父进程获取到这个值
示例2:
//利用exit和_exit函数退出进程
int main()
{printf("main\n");//单进程//exit(0);//清空缓存区,并退出进程_exit(0);//不清空缓存区,退出进程//后面的代码不会运行printf("long may the sunshine\n");
}
exit()和return的区别
1)在main函数内,exit()和return基本没区别
2)在除main的其他函数体内,exit()表示退出当前进程,return表示退出当前函数
4.wait(int *status),waitpid(pid_t pid, int *status, int options)
头文件:
#include <sys/types.h>
#include <sys/wait.h>
函数体:
pid_t wait(int *status)
pid_t waitpid(pid_t pid, int *status, int options)
参数:(ubuntu系统用命令man 2 wait查看相关信息)
pid为要等待的子进程号
status指子进程的退出状态,父进程不使用该状态可设置为NULL
options可以为0或下面的OR组合
1)WNOHANG 如果没有任何已经结束的子进程则立即返回,无须等待
2)WUNTRACED 如果子进程进入暂停态则立即返回,但结束状态不予理会,结束状态保存在status中
函数作用:
等待一个进程退出,回收该进程,即修改子进程状态(从僵尸态改为死亡态)
返回值:
成功返回:成功回收的子进程id号
失败返回:-1
示例3:
//获取子进程退出值
int main()
{printf("long may the sunshine:%d\n",getpid());pid_t id = fork();if(id < 0){printf("fork error\n");return -1;}else if(id > 0){printf("father progress:%d\n",getpid());}else if(id == 0){printf("son progress:%d\n",getpid());exit(0);//此时子进程结束printf("Am I alive?\n");}int status;wait(&status);//此时的status是退出状态并不是退出值,需要调用系统定义的宏函数来从退出状态中提取退出值if(WIFEXITED(status))//先判断是否正常退出,宏函数WIFEXITED提取退出值{printf("status:%d",WIFEXITED(status));}return 0;
}
运行结果:
可得子进程的退出值为1
系统编程(程序与进程,进程操作API)相关推荐
- Linux系统编程(三)进程间的通信
Linux系统编程(三)进程间的通信 一.为什么需要进程之间的通信(IPC)? 二.管道 1.概念 2.特质 3.原理 4.局限性 5.代码 2.读入数据 三.共享存储映射 注意事项 父子进程通信 一 ...
- linux系统编程学习_(2)进程控制-- fork函数、exec函数族、回收子进程--孤儿进程僵尸进程、wait函数
linux系统编程学习_(2)进程控制-- fork函数.exec函数族.回收子进程–孤儿进程僵尸进程.wait函数 进程控制 fork()函数 创建一个子进程. pid_t fork(void); ...
- C语言嵌入式系统编程修炼之道——屏幕操作篇
C语言嵌入式系统编程修炼之道--屏幕操作篇 作者:宋宝华 e-mail:[email]21cnbao@21cn.com[/email] 1.汉字处理 现在要解决的问题是,嵌入式系统中经常要使用的并非 ...
- 【Linux | 系统编程】Linux系统编程(文件、进程线程、进程间通信)
文章目录 Linux系统编程 文件IO open/close函数 read/write函数 文件描述符 阻塞.非阻塞 fcntl函数 lseek函数 传入传出参数 文件系统 文件存储 文件操作 sta ...
- 【Linux系统编程】浅谈进程地址空间与虚拟存储空间
早期的内存分配机制 在早期的计算机中,要运行一个程序,会把这些程序全都装入内存,程序都是直接运行在内存上的,也就是说程序中访问的内存地址都是实际的物理内存地址.当计算机同时运行多个程序时,必须保证这些 ...
- 【Linux系统编程学习】Linux进程控制原语(fork、exec函数族、wait)
此为牛客Linux C++和黑马Linux系统编程课程笔记. 1. fork函数 1.1 fork创建单个子进程 #include<unistd.h> pid_t fork(void); ...
- potplayer 多个进程_Linux系统编程1.2:进程概念简介
进程是操作系统中最重要的概念之一. 一.进程的概念 在UNIX/Linux中, 进程是正在执行的程序, 它相当于Windows环境内的任务.每个进程包括程序代码和数据.其中数据包含程序变量数据.外部数 ...
- 初始Linux—Linux系统编程第三节——初始进程
目录 冯 · 诺依曼体系结构 操作系统:Operator System(OS) 进程的基本概念 进程标识符 通过系统调用创建进程-fork初识 进程状态 僵尸进程 孤儿进程 进程优先级 环境变量 和环 ...
- C语言嵌入式系统编程修炼之(四)屏幕操作
C语言嵌入式系统编程修炼之屏幕操作 汉字处理 现在要解决的问题是,嵌入式系统中经常要使用的并非是完整的汉字库,往往只是需要提供数量有限的汉字供必要的显示功能.例如,一个微波炉的LCD上没有必要提供显示 ...
- 【Linux系统编程】线程与进程的比较
在许多经典的操作系统教科书中,总是把进程定义为程序的执行实例,它并不执行什么, 只是维护应用程序所需的各种资源,而线程则是真正的执行实体. 为了让进程完成一定的工作,进程必须至少包含一个线程. 进程, ...
最新文章
- Redis的KEYS命令引起宕机事件
- 计算机二级题目小汽车大客车,浙江省计算机二级办公软件Excel练习题.xls
- c# ef报错_C#中Entity Framework常见报错汇总
- Algs4-1.4.14 4-sum
- 电脑开机3秒就重启循环_小米9不开机、循环重启,插充电器屏幕没反应怎么回事?听说是通病,可以维修吗?...
- NET的JIRA活动时间线REST API
- 6-4 破碎的键盘 uva11988
- 通过存储过程,插入300万条数据的一点思考?
- livereload(自动刷新)
- 医疗行业源代码保密解决方案
- mc服务器切换模式显示英文字母,我的世界更改模式的指令是什么_MC切换模式指令方法新版...
- 机器学习之从基础数学深入剖析逻辑回归(案例理论相结合)
- cf两边黑屏怎么解决win10_Win10/7系统进入LOL英雄联盟显示输入不支持并黑屏原因及解决方法...
- 记录日常行程的微信小程序开发与实现-武汉理工大学
- PC与西门子PLC通讯免费软件Libnodave
- 压力测试/性能测试工具LoadRunner录制脚本详细步骤(一)
- 颜体html标签,颜体楷书笔法32式详解,一定不能错过!(超级干货)
- 又一巅峰!,Java开发实用必备的几款插件
- 【数值模型系列】link_grib.csh脚本解读
- python如何读取weboutlook内容_用Python通过MAPI读取Outlook中的电子邮件