用fork可以创建新进程,用exec可以执行新程序。exit函数和两个wait函数处理终止和等待终止

  1. fork派生进程。fork函数时调用一次,返回两次,成功时:子进程中返回值为0,父进程中返回值为子进程的PID。子进程是根据父进程为模板来创建的,只是共享正文段,因此父子的代码段是一样的(相同的代码只是fork()之下的代码,而不是从头到尾)。但是父子进程的数据是独有的(写时复制技术)。父进程是从代码头到代码的结束。子进程是从fork()开始到代码结束。注意:fork创建子进程,把父进程数据空间、堆和栈复制一份,1.父子进程只是共享代码段,其他的数据空间、堆栈各自有一份改变数据相互之间不受影响;2.父进程的所有打开文件描述符都被复制到子进程中,相当于调用dup函数,父子进程打开描述符共享文件表项,也即使共享同一文件偏移量。fork的常见用法:1.父进程复制自己,使父进程和子进程同时执行不同的代码段。2.一个进程要执行一个不同的程序,子进程从fork返回后立即调用exec.
  2. vfork创建子进程,与父进程内存数据共享;vfork先保证子进程先执行,当子进程调用exit()或者exec后,父进程才往下执行。
  3. exec执行。用fork函数创建子进程后,子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程执行的程序完全替换为新程序,而新程序则从其main函数开始执行。因为调用exec并不创建新进程,所以前后的进程ID并未改变。exec只是用一个全新的程序替换了当前进程的正文、数据、堆和栈段,也就是说会改变地址空间。若成功不返回,失败返回-1。
  4. exit终止进程。 exit 和return的区别关联:return会释放局部变量,并弹栈,回到上级函数执行。exit直接退掉。如果你用c++ 你就知道,return会调用局部对象的析构函数,exit不会。exit :先执行标准io库清理关闭操作,即调用fclose函数,载返回内核。而_exit立即进入内核。
  5. 进程正常终止(5种办法)
  6. 从main返回,等效于调用exit

    调用exit,exit 首先调用各终止处理程序,然后按需多次调用fclose,关闭所有的打开流。

    调用_exit或者_Exit

    最后一个线程从其启动例程返回

    最后一线程调用pthread_exit                                                                                                                                                                  异常终止(3种)

  7. 调用abort

    接到一个信号并终止

    最后一个线程对取消请求作出响应

  8. wait 获取子进程的信息,如果没有子进程终止,父进程会一直阻塞。直到有一个子进程终止,会立即返回子进程的pid。waitpid有若干选项(-1表示等待任意一子进程,与wait等效)。另外可以提供一个非阻塞版本,options使用WNOHANG,如果没有子进程退出,则waitpid不阻塞,返回值为0。如果有子进程退出,正常返回子进程号。
  9. 僵尸进程:如果子进程先结束而父进程后结束,即子进程结束后,父进程还在继续运行但是并未调用wait/waitpid那子进程就会成为僵尸进程。inux中命令ps,标记为Z的进程就是僵尸进程。原理:在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存。但是仍然保留了一些信息(如进程号pid 退出状态 运行时间等)。这些保留的信息直到进程通过调用wait/waitpid时才会释放。这样就导致了一个问题,如果没有调用wait/waitpid的话,那么保留的信息就不会释放。比如进程号就会被一直占用了。但系统所能使用的进程号的有限的,如果产生大量的僵尸进程,将导致系统没有可用的进程号而导致系统不能创建进程。但如果在孤儿进程终止时,init只要有一个子进程终止,init就会调用wait函数取得终止状态,所以孤儿进程不会变成僵尸进程。
  10. 但如果子进程后结束,即父进程先结束了,但没有调用wait/waitpid来等待子进程的结束,此时子进程还在运行,父进程已经结束。那么并不会产生僵尸进程。init来接管它,成为这个子进程的父进程。该子进程变成孤儿进程。
  11. 当一个子进程终止后,会向父进程发送SIGCHILD信号.属于异步通知。
  12. waitpid等待指定进程,但如果是WNOHANG选项,若指定的子进程不是立即可用,则waitpid不阻塞,返回值为0.
  13. 实际用户ID:运行这个进程的用户ID,即父进程的实际用户id。有效ID:当前进程的所使用的用户ID。保留用户id:进程原先的用户id.
  14. 进程有独立的地址空间,而同一进程中的线程共享该进程的地址空间。
  15. 线程有自己线程栈,线程可以直接访问全局变量,甚至可以访问进程地址空间中的每一个内存,所以一个线程可以读写甚至清楚另一个线程的堆栈。
  16. 统一进程下的线程共享数据(比如全局变量,静态变量,打开的文件,子进程)这些手段实现。
  17. linux中进程具有父子关系,形成进程树,但是线程是平等的没有父子关系。
  18. 对于 Windows 系统来说,开进程开销大,鼓励单进程多线程工作,因此 Windows 多线程学习重点是要大量面对资源争抢与同步方面的问题。
  19. 查看进程信息的命令:    ps -ef:查看所有的进程信息。
            ps aux:查看进程的详细信息。
            top;(查看进程的信息)
            查看你所要的进程信息: ps -ef | 名字
  20. 杀死进程的命令:kill 进程号
  21. 其实进程的地址空间是一个虚拟的地址,并不是物理内存的地址。其实虚拟地址和物理地址直接有一个页表的存在。记录虚拟地址与物理地址之间的映射关系。如果父子进程修改这个全局变量的话,虚拟内存的地址不变,但是在物理内存空间会重新分配一块内存来保存你父子进程修改后的数据,并更新页表,这样也就是为什么你发现父子进程中一个变量它的虚拟地址相同但是值不同原因。
  22. 需要存放在程序文件的段只有正文段和初始化数据段。
  23. 进程id = 0,为交换进程,不执行任何程序。id = 1,为init进程,绝不会终止,所有孤儿进程的父进程。id= 2,页守护进程。
  24. 常用函数: getpid   调用进程的进程id      getppid   调用进程的父进程id      getuid   调用进程的实际用户id
  25. 调整策略和调度优先级是由内核确定的,进程通过nice值。nice值越小,优先级越高。getpriority(which,who), 参数who则依which值有不同定义. which 可以是PRIO_PROCESS表示进程, 参数who为0,则返回当前进程的进程优先级;参数who不为0,则返回进程号为who的进程的优先级。PRIO_PGRP表示进程组,PRIO_USER表示用户id.
  26. getpgrp 等价于getpgid(0),表示获取进程组id.  setpgid 加入进程组。

linux 进程学习相关推荐

  1. linux pipe 命名管道,linux 进程学习笔记-named pipe (FIFO)命名管道

    与"无名管道"不同的是,FIFO拥有一个名称来标志它,所谓的名称实际上就是一个路径,比如"/tmp/my_fifo",其对应到磁盘上的一个管道文件,如果我们用f ...

  2. 在Linux系统下实现进程,Linux进程学习(一)之Linux进程的基本知识和实现

    最近一周学习了Linux 进程编程的知识,现对其总结如下. 在第一部分中我们先对进程的基本概念以及在Linux 中是如何来现实进程的进行介绍 Tiger-John说明 : 许多人在学习中只注重如何编程 ...

  3. Linux进程学习(孤儿进程和守护进程)

    孤儿进程和守护进程 通过前面的学习我们了解了如何通过fork()函数和vfork()函数来创建一个进程.现在 我们继续深入来学习两个特殊的进程:孤儿进程和守护进程 一.孤儿进程 1.什么是 孤儿进程 ...

  4. linux 进程学习笔记-进程信号sigal

    信号(或软中断)是在软件层次上对中断的一个模拟,其运行在"用户空间",一个进程对另外一个或几个进程通过发送信号来实现异步通信.当接收进程接收到信号后,其可以注册一下处理函数来说对这 ...

  5. linux中怎样获得进程描述符,linux进程学习-进程描述符,控制块

    datepicker使用 JqueryUI作为一个优秀的前端库,被广泛的应用在项目中.之前做的一个排班考勤系统,跟时间打交道较多,对时间控件做过一些对比,觉得jqueryUI里的这个datepicke ...

  6. Linux 进程学习(四)------ sigaction 函数

    转自:http://www.cnblogs.com/wblyuyang/archive/2012/11/13/2768923.html 使用 sigaction 函数:  signal 函数的使用方法 ...

  7. Linux进程学习【进程状态】

    ✨个人主页: Yohifo

  8. Linux进程地址空间学习总结

    Linux内核--内核地址空间分布和进程地址空间 http://www.cnblogs.com/bizhu/archive/2012/10/09/2717303.html 内核地址空间分布 直接映射区 ...

  9. linux进程的环境变量,LINUX系统学习一(进程、MMU,环境变量、getenv、fork、getpid/ge...

    LINUX系统学习一(进程.MMU,环境变量.getenv.fork.getpid/ge LINUX系统学习一(进程.MMU,环境变量.getenv.fork.getpid/getppid.ps.ki ...

  10. Linux进程线程学习笔记:运行新程序

    Linux进程线程学习笔记:运行新程序 周银辉 在上一篇中我们说到,当启动一个新进程以后,新进程会复制父进程的大部份上下文并接着运行父进程中的代码,如果我们使新进程不运行原父进程的代码,转而运行另外一 ...

最新文章

  1. satd残差_RDO、SAD、SATD、λ(转贴) - [h.264]
  2. JVM(Java虚拟机)优化大全和案例实战
  3. [***]HZOJ 柱状图
  4. android用户登录volley,如何在Android上使用Volley进行基本身份验证?
  5. java web 加载类_Java中用ClassLoader载入各种资源(类、文件、web资源)的方法
  6. STC单片机使用RS485下载程序方法
  7. matlab凑数求和,凑数求和算法 C语言问题 C语言求和算法
  8. oracle11g dbf恢复数据库,dbf文件如何恢复数据库
  9. Ubuntu系统上编译和安装perl和cpan模块
  10. android蓝牙hid 鼠标,BLE HID协议-----蓝牙鼠标代码流分析
  11. xp打印机服务器属性修复,xp打印机服务器属性设置
  12. 简单的flask入门,自己来写网页
  13. Ubuntu 安装 uWSGI
  14. 数值计算(五)——函数逼近一致逼近多项式(1)
  15. 人工智能是什么?做AI要学什么?
  16. osgEarth使用笔记4——加载矢量数据
  17. 消费者与电商变革传统企业
  18. 解决Deprecated: Methods with the same name as their class will not be constructors in报错方案
  19. 中学物理教学参考杂志社中学物理教学参考编辑部2022第9期目录
  20. loadrunner的吞吐量和吞吐率

热门文章

  1. Python一个很好玩的特性decorator
  2. .NET简谈反射(动态调用)
  3. 五 C# 多线程研究 使用Mutex类来同步方法及其与Monitor类和Lock之间的区别
  4. [转载]Windows Vista user profile service服务未能登录
  5. threeJs 入门
  6. OpenLayers学习入门篇
  7. Java中的>>,>>>
  8. python三十七课_第七课:你知道如何用python做个整蛊朋友的小病毒吗?看这里!七行代码搞定!...
  9. input输入框大小设置_Qualtrics调查问卷设计1-如何在输入框前后添加辅助文字
  10. WinForm程序利用sqlhelp连接SQLserver数据库