一、什么是程序,什么是进程

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)相关推荐

  1. Linux系统编程(三)进程间的通信

    Linux系统编程(三)进程间的通信 一.为什么需要进程之间的通信(IPC)? 二.管道 1.概念 2.特质 3.原理 4.局限性 5.代码 2.读入数据 三.共享存储映射 注意事项 父子进程通信 一 ...

  2. linux系统编程学习_(2)进程控制-- fork函数、exec函数族、回收子进程--孤儿进程僵尸进程、wait函数

    linux系统编程学习_(2)进程控制-- fork函数.exec函数族.回收子进程–孤儿进程僵尸进程.wait函数 进程控制 fork()函数 创建一个子进程. pid_t fork(void); ...

  3. C语言嵌入式系统编程修炼之道——屏幕操作篇

    C语言嵌入式系统编程修炼之道--屏幕操作篇 作者:宋宝华  e-mail:[email]21cnbao@21cn.com[/email] 1.汉字处理 现在要解决的问题是,嵌入式系统中经常要使用的并非 ...

  4. 【Linux | 系统编程】Linux系统编程(文件、进程线程、进程间通信)

    文章目录 Linux系统编程 文件IO open/close函数 read/write函数 文件描述符 阻塞.非阻塞 fcntl函数 lseek函数 传入传出参数 文件系统 文件存储 文件操作 sta ...

  5. 【Linux系统编程】浅谈进程地址空间与虚拟存储空间

    早期的内存分配机制 在早期的计算机中,要运行一个程序,会把这些程序全都装入内存,程序都是直接运行在内存上的,也就是说程序中访问的内存地址都是实际的物理内存地址.当计算机同时运行多个程序时,必须保证这些 ...

  6. 【Linux系统编程学习】Linux进程控制原语(fork、exec函数族、wait)

    此为牛客Linux C++和黑马Linux系统编程课程笔记. 1. fork函数 1.1 fork创建单个子进程 #include<unistd.h> pid_t fork(void); ...

  7. potplayer 多个进程_Linux系统编程1.2:进程概念简介

    进程是操作系统中最重要的概念之一. 一.进程的概念 在UNIX/Linux中, 进程是正在执行的程序, 它相当于Windows环境内的任务.每个进程包括程序代码和数据.其中数据包含程序变量数据.外部数 ...

  8. 初始Linux—Linux系统编程第三节——初始进程

    目录 冯 · 诺依曼体系结构 操作系统:Operator System(OS) 进程的基本概念 进程标识符 通过系统调用创建进程-fork初识 进程状态 僵尸进程 孤儿进程 进程优先级 环境变量 和环 ...

  9. C语言嵌入式系统编程修炼之(四)屏幕操作

    C语言嵌入式系统编程修炼之屏幕操作 汉字处理 现在要解决的问题是,嵌入式系统中经常要使用的并非是完整的汉字库,往往只是需要提供数量有限的汉字供必要的显示功能.例如,一个微波炉的LCD上没有必要提供显示 ...

  10. 【Linux系统编程】线程与进程的比较

    在许多经典的操作系统教科书中,总是把进程定义为程序的执行实例,它并不执行什么, 只是维护应用程序所需的各种资源,而线程则是真正的执行实体. 为了让进程完成一定的工作,进程必须至少包含一个线程. 进程, ...

最新文章

  1. Redis的KEYS命令引起宕机事件
  2. 计算机二级题目小汽车大客车,浙江省计算机二级办公软件Excel练习题.xls
  3. c# ef报错_C#中Entity Framework常见报错汇总
  4. Algs4-1.4.14 4-sum
  5. 电脑开机3秒就重启循环_小米9不开机、循环重启,插充电器屏幕没反应怎么回事?听说是通病,可以维修吗?...
  6. NET的JIRA活动时间线REST API
  7. 6-4 破碎的键盘 uva11988
  8. 通过存储过程,插入300万条数据的一点思考?
  9. livereload(自动刷新)
  10. 医疗行业源代码保密解决方案
  11. mc服务器切换模式显示英文字母,我的世界更改模式的指令是什么_MC切换模式指令方法新版...
  12. 机器学习之从基础数学深入剖析逻辑回归(案例理论相结合)
  13. cf两边黑屏怎么解决win10_Win10/7系统进入LOL英雄联盟显示输入不支持并黑屏原因及解决方法...
  14. 记录日常行程的微信小程序开发与实现-武汉理工大学
  15. PC与西门子PLC通讯免费软件Libnodave
  16. 压力测试/性能测试工具LoadRunner录制脚本详细步骤(一)
  17. 颜体html标签,颜体楷书笔法32式详解,一定不能错过!(超级干货)
  18. 又一巅峰!,Java开发实用必备的几款插件
  19. 【数值模型系列】link_grib.csh脚本解读
  20. python如何读取weboutlook内容_用Python通过MAPI读取Outlook中的电子邮件

热门文章

  1. 不同IP网段共享打印机
  2. java实现线程三种方式_详解三种java实现多线程的方式
  3. SoC EDS 17.0 和 DS-5 下载和安装
  4. 4-TDengine图形化管理工具TDengineGUI与IDEA插件
  5. Unity的DrawCalls和Batches的优化处理
  6. 计算机二级考试python考试大纲_2019年计算机二级Python语言程序设计考试大纲
  7. 速达软件 移动端 App 功能说明
  8. 远程服务器上共享文件夹的上传与下载
  9. 企业找代理记账公司后是否就不用管了?
  10. python中的缩进快捷键_python如何缩进