• 进程创建
  • 进程终止
  • 进程等待
  • 程序替换

进程创建

fork函数

创建一个子进程,父子进程代码共享,数据独有

#include <unistd.h>
pid_t fork(void);
返回值:自进程中返回0,父进程返回子进程id.出错返回1。

当调用fork函数时,通过使用写时拷贝技术来拷贝父进程的信息。

写时拷贝技术:子进程通过复制父进程的pcb,使得复制进程指向同一块物理内存,同时运行位置,和代码相同。但又因为进程之间需要独立性,所以当某一个进程数据发生改变的时候会重新给子进程开辟物理内存,将数据拷贝过去。(之所以这样使用是因为如果数据不修改的话还开辟空间拷贝数据会使效率降低)

这也就是数据独有的原因。
代码共享:通过页表来实现访问控制,使代码段是只读的,不可修改。

vfork函数

创建一个子进程,并且阻塞父进程,直到子进程退出或者程序替换,父进程才继续运行。

#include <unistd.h>
pid_t vfork(void);
返回值:自进程中返回0,父进程返回子进程id.出错返回1。

vfork创建子进程的效率比fork要高,因为vfork所创建的子进程和父进程共用同一个虚拟地址空间。

但也因为这样,进程之间就不具备独立性,父子进程不能同时访问代码段和数据段,所以当子进程运行的时候必须要阻塞父进程,防止产生冲突。

虽然vfork效率高,但是fork因为实现了写时拷贝技术,效率提高了不少,所以vfork已经很少使用了。


进程终止

在linux下有三种终止进程的方法。

return:

只能在main函数中使用,退出后刷新缓冲区

exit:

库函数调用接口

#include <unistd.h>
void exit(int status);
退出刷新缓冲区

_exit:

系统函数调用接口

#include <unistd.h>
void _exit(int status);
参数:status 定义了进程的终止状态,父进程通过wait来获取该值
退出不刷新缓冲区


进程等待

之前讲过,如果子进程退出时没有给父进程返回退出的信息,父进程就会以为他并没有退出,所以一直不释放他的资源,使子进程进入僵尸状态。
之前的解决方法是退出父进程,但是那个不是一个合理的解决方法,这里有更好的方法,就是进程等待。

wait

阻塞等待任意一个进程退出,获取退出子进程的pid,并且释放子进程资源。

#include<sys/types.h>
#include<sys/wait.h>
pid_t wait(int*status);
返回值:
成功返回被等待进程pid,失败返回-1。
参数:
输出型参数,获取子进程退出状态,不关心则可以设置为NULL

阻塞:为了完成某个功能发起调用,如果不具备完成功能的条件,则调用不返回一直等待。
非阻塞:为了完成某个功能发起调用,如果不具备完成功能的条件,则立即报错返回

waitpid

可以指定等待一个子进程的退出

#include<sys/wait.h>
pid_ t waitpid(pid_t pid, int *status, int options);
返回值:
当正常返回的时候waitpid返回收集到的子进程的进程ID;
如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;
如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在;
参数:
pid:
Pid=-1,等待任一个子进程。与wait等效。
Pid>0.等待其进程ID与pid相等的子进程。
status:
WIFEXITED(status): 若为正常终止子进程返回的状态,则为真。(查看进程是否是正常退出)
WEXITSTATUS(status): 若WIFEXITED非零,提取子进程退出码。(查看进程的退出码)
options:
WNOHANG: 若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若正常结束,则返回该子进程的ID。


程序替换

创建子进程必定是想让子进程做与父进程不一样的事情,如果采用判断pid的方法来进行代码分流,这样的程序会非常庞大,所以还有更好的方法,就是程序替换。

程序替换

替换一个进程正在调度的程序信息(加载另一个程序到内存中,让PCB不在调度原来的程序,调度这个新的程序。只是改变了映射关系,所以原本的PCB和程序还在 )

exec

#include <unistd.h>`
int execl(const char *path, const char *arg, …);
int execlp(const char *file, const char *arg, …);
int execle(const char *path, const char *arg, …,char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);

乍一看这么多接口很不容易记,其实是有规律的。

l(list) : 表示参数采用列表
v(vector) : 参数用数组
p(path) : 有p自动搜索环境变量PATH
e(env) : 有e表示自己维护环境变量

Linux 进程控制 :进程创建,进程终止,进程等待,程序替换相关推荐

  1. Linux——进程控制:创建、终止、等待、替换

    进程创建 fork #include <unistd.h> pid_t fork(void); 操作系统做了什么? 调用fork之后,内核的工作: 分配新的内存块和内核数据结构给子进程 将 ...

  2. linux——进程(创建、终止、等待、替换)

    进程的基本操作 概念 程序运行的一个实例,其占有一定的空间. 查询某一进程当前情况 ps aux | grep 进程名 终止进程 kill -9 pid: //pid指需要终止的进程pid 创建 pi ...

  3. 【Linux】Linux进程控制 --- 进程创建、终止、等待、替换、shell派生子进程的理解…

    柴犬: 你好啊,屏幕前的大帅哥or大美女,和我一起享受美好的今天叭

  4. linux用命令强制关闭进程,Linux如何使用kill命令强制终止进程

    Linux如何使用kill命令强制终止进程 在Windows系统中,如果应用程序无反应我们会启动任务管理器终止应用,而在Linux系统中则使用kill命令,kill命令主要用于强制关闭进程,下面小编就 ...

  5. 进程控制(2):进程操作

    前言: 关于进程控制这块的好文很多,下面转载的这篇内容很丰富,也会举适当的栗子,与其写的一知半解不如参读学习别人的优秀博文,感谢原作,本系列摘录自:https://www.cnblogs.com/xi ...

  6. 【Linux】进程控制(创建、终止、等待)

    环境:centos7.6,腾讯云服务器 Linux文章都放在了专栏:[Linux]欢迎支持订阅 相关文章推荐: [Linux]冯.诺依曼体系结构与操作系统 [Linux]进程理解与学习Ⅰ-进程概念 [ ...

  7. 进程控制(进程创建与终止 | 进程等待 | 程序替换)

    文章目录 一.进程创建 1. fork函数 2. fork创建进程 3. 写时拷贝 二.进程终止 1. 进程退出有三种情况 2. 常见进程终止方法 三.进程等待 背景(必要性) 1. 进程等待的方法 ...

  8. Linux系统调用:创建和终止进程

    1.进程的三种状态 1.运行.要么在被CPU执行,要么等待被执行且最终会被内核调度. 2.停止.执行被挂起且不会被调度.收到特定信号后才能继续运行. 3.终止.进程永远地停止了.可能的原因有三种:(1 ...

  9. 进程控制-创建、退出、等待、替换

    目录 进程创建 1.子进程继承 2.写时拷贝 进程退出 echo $? 退出码 进程异常退出的情况模拟: 退出进程的方式 退出码的意义: 进程退出,在系统中发生了什么? 进程等待 为什么要有进程等待呢 ...

  10. linux 创建子进程,linux中fork同时创建多个子进程的方法(一)

    Fork同时创建多个子进程方法 第一种方法:验证通过 特点:同时创建多个子进程,每个子进程可以执行不同的任务,程序 可读性较好,便于分析,易扩展为多个子进程 int main(void) { prin ...

最新文章

  1. 树莓派视觉小车 -- 人脸追踪(人脸识别、PID控制舵机运动)
  2. Gartner:2019十大战略技术趋势
  3. 《Pro ASP.NET MVC 3 Framework》学习笔记之十六【示例项目SportsStore】
  4. java 判断是否是list_给Java程序员的20个链表面试题
  5. python与c语言在语法上的区别-C语言和Python编程先学习哪个
  6. Jquery中使用ajax传json参数并从SpringBoot后台Controller返回消息
  7. 苹果开发几个常见的错误
  8. 太极计算机长沙,他设计了湖南最有尊严的建筑,诗意得让你想在里面加班
  9. Cloudstack安装(二)
  10. Packt和Java Code Geeks提供的$ 5 Java编程书籍!
  11. Spring Cloud的核心成员、以及架构实现详细介绍
  12. Oracle —— 如何执行SQL文件
  13. 分享50道硬核Python编程题,面试前过一遍
  14. 树莓派基础实验24:超声波测距传感器实验
  15. 开发一款游戏so easy教你如何识别靠谱的游戏外包公司
  16. 中文的括号和英文的括号区别_小括号、中括号、大括号,英文怎么说?
  17. web项目 Eclipse 中 jsp 页面 没有代码提示
  18. 阿里面试官:高并发大流量秒杀系统如何正确的解决库存超卖问题?(建议收藏)
  19. 强大的W32Dasm反汇编工具使用教程
  20. python报错:source code string cannot contain null bytes

热门文章

  1. 代理模式coding-静态代理
  2. 树和二叉树的基本概念(二级)
  3. vivado 验证ddr引脚_vivado下ddr3的读写和测试详解
  4. 【报错笔记】在maven项目中jsp页面使用window.location.href给controller传参时参数过长所以路径无法跳转至controller
  5. Data Lake Analytics: 使用DataWorks来调度DLA任务
  6. Android——发送和接收广播
  7. ifconfig命令无法找到,提示bash: ifconfig: command not found
  8. 用Matlab与c++程序生成的数据文件绘制sin函数
  9. ngnx 301 302跳转配置方法
  10. DHCP+TFTP+VSFTP+pxelinux+kickstart实现RedHat的自动安装