前言

今天读完了《UNIX环境高级编程》第八章,这一章围绕着进程的创建过程需要涉及的各种配置进行讲解,还讲解了如何处理子进程的退出。

exec函数族

当使用fork函数创建子进程后,这个子进程执行的程序有两种:

  • 与父进程执行同一个程序的不同代码段
  • 执行另一个程序

如果需要子进程执行父进程的代码,我觉得的可以考虑使用线程,而不是进程了。所以我觉得,创建子进程主要就是用来执行另一个程序的,而这就涉及到exec函数族了。

需要注意的是,执行exec函数,并没有创建新的进程,而是加载了新的程序。(我们可以用C语言写一个类似脚本的东西,在这个程序里,调用exec执行不同的程序)

这个函数族有7个函数,目的都是用新的程序替换从父进程复制来的程序,主要区别有四种:

  1. 使用可变长参数传递命令行参数和环境变量参数,exec后面为 l (list);使用数组传递命令行参数和环境变量参数,exec后边为v(vector)。
  2. 如果可以传递环境变量参数,则exec后边加上e(environ)
  3. 如果使用PATH查找文件,则exec后面加上p(path)
  4. 使用文件描述符定位文件,则exec前面加上f

在实现这些函数时,并不是每个函数都单独时,可能一个会是另一个的封装,书中就提到一种实现,其关系如下图:

当使用exec执行脚本文件时,并不是把脚本文件当作可执行文件,进行加载,而是加载脚本文件的第一行指定的解释器程序作为进程的上下文。

进程权限

进程的权限通过检查进程的几种ID决定(不同的UNIX实现,可能还有别的的ID)

当程序被执行时,系统会将实际用户ID和组ID设置为执行用户的ID和组ID。然后检查程序文件的set-user-id位,如果设置该位,则有效用户ID为文件的uid,对组ID同理。然后将有效用户ID和组ID复制到保存的设置用户ID和组ID(这一过程一般由exec函数做)

以上时,创建一个进程时,其默认的权限。UNIX系统还提供了一些函数,来修改这些ID,以改变进程的权限。

对于普通用户,其不能随意设置用户ID和组ID,由于一般系统进行权限检查时,主要使用的是有效用户ID和组ID,所以一般进程也是通过修改有效用户ID,来改变进程的权限的。但是这个有效用户ID只能从实际用户ID和保存设置用户ID中选,不能设置为其他的用户ID。

处理子进程终止状态

当子进程退出时,系统不会立即删除该子进程的进程描述符,并将进程状态设置为Z(zombie),然后等待父进程处理子进程的退出。如果父进程不处理,那么子进程就会一直处于僵尸状态。

父进程处理子进程使用wait函数族。当使用wait函数处理完子进程的终止状态后,子进程才彻底的消失了,在次调用wait函数处理该子进程将会出错。

子进程的终止状态一般由一个整型变量status表示,这个变量主要包含两方面的信息

  1. 进程的退出状态(main函数的返回值,或者exit函数的参数)
  2. 进程退出时,涉及的一些信号,如进程异常退出,就会由SIGABRT信号

当然其实还可以获取子进程的更多的信息,如运行时长等,这一般要使用wait3和wait4函数。

在使用wait函数时,一般等待三种进程的退出

  • 等待任意一子进程退出
  • 等待具体的某个子进程退出
  • 等待某个进程组的任意一子进程退出

一般情况下wait函数的目的就是取出子进程的终止状态,但是通过设置一些选项,我们可以控制wait的一些行为,比如非阻塞式的,只查看是否有子进程退出,而不取出该子进程的终止状态等。

子进程中获取父进程id_UNIX环境高级编程——进程控制相关推荐

  1. 子进程中获取父进程id_进程全家桶,看这一篇就够了 | 原力计划

    作者 | 看,未来 责编 | 王晓曼 出品 | CSDN博客 初见进程,先查一下户口 1.进程环境 进程控制块PCB:就是进程在操作系统中的"户口",具体实现是 task_stru ...

  2. Unix环境高级编程—进程关系

    终端登录 网络登录 进程组 getpgrp(void) setpgid(pid_t pid, pid_) 会话: 是一个或多个进程组的集合,通常由shell的管道将几个进程编成一组. setsid(v ...

  3. UNIX环境高级编程——进程关系

    9.1 引言 本章详细说明进程组以及会话的概念,还将介绍登录shell(登录时所调用的)和所有从登录shell启动的进程之间的关系. 9.2 终端登录 9.3 网络登录 9.4 进程组 每个进程除了有 ...

  4. unix环境高级编程----进程控制fock()函数

    1.进程标识符 每一个进程,都有一个id来对其进行标示. 用getpid()就可以获取当前的进程的id 2.fork()函数 fork函数是创建一个进程,这个进程就是当前进程的子进程.子进程就是当前线 ...

  5. Js/Jquery获取iframe中的元素 在Iframe中获取父窗体的元素方法

     在web开发中,经常会用到iframe,难免会碰到需要在父窗口中使用iframe中的元素.或者在iframe框架中使用父窗口的元素 js 在父窗口中获取iframe中的元素  1. 格式:win ...

  6. Unix环境高级编程中的apue.h配置

    本文解释Unix环境高级编程的环境搭建中,apue.h如何使用安装及问题解决. 使用的是<Unix环境高级编程>第三版: 系统为CentOS 7.4,64位(Linux系统都可参考): 文 ...

  7. UNIX环境高级编程笔记

    1.setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opt, len);   SO_REUSEADDR套接口选项允许为以下四个不同的目的提供服务:   ...

  8. 【UNIX环境高级编程】

    [UNIX环境高级编程] 环境搭建 1.下载源码 wget http://apuebook.com/src.3e.tar.gz 2.解压 tar -zxvf src.3e.tar.gz 3.安装lib ...

  9. Unix环境高级编程 笔记

    Unix环境高级编程(第二版)学习笔记 这是一次较长时间的整理,然而跳跃了一些章节和很多知识点,仍然是很不完善很不全面的. 前言 操作系统某些问题 严格意义上,可将操作系统定义为一种软件,它控制计算机 ...

  10. 【unix】unix环境高级编程

    文章目录 1.UNIX基础知识 1.基本知识 2.文件和目录 3.输入和输出 4.程序和进程 5.出错处理 6.用户标识 7.信号 8.时间 9.系统调用和库函数 标准化和实现 1.标准化 ⑴ISO ...

最新文章

  1. 《ArcGIS Runtime SDK for Android开发笔记》——(6)、基于Android Studio的ArcGIS Android工程结构解析...
  2. 吴恩达:告别大数据,AI需要高质量小数据!
  3. JavaWeb学习之路——SSM框架之Spring(五)
  4. JavaScript frame跨域获取元素、修改元素属性、调用其他frame页面方法
  5. everyday words
  6. bzoj 1645: [Usaco2007 Open]City Horizon 城市地平线【线段树+hash】
  7. 2014-07-24 .NET实现微信公众号的消息回复与自定义菜单
  8. (笔记)Linux内核学习(三)之进程调度
  9. Docker 镜像制作之DockerFile
  10. 链家广州二手房的数据与分析——数据分析1
  11. win10计算机管理看不见蓝牙,win10蓝牙不见了的解决方法
  12. Racket Cheat Sheet
  13. 初次使用Chloe(本人小白)
  14. 图片懒加载及资源节流
  15. CPU Machine Check Architecture Error Dump (CPU: Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz, CPUID: 0x
  16. 计算机二级考试office资料,2017年国家计算机二级office考试资料
  17. java随机中文名_Java随机产生中文昵称
  18. JQuery替换元素
  19. Postman测试工具调试接口详细教程【向后端发送Json数据并接收返回的Json结果】
  20. 零知识证明系列之二——Schnorr协议

热门文章

  1. C++实现 逆波兰表达式计算问题
  2. 通过消息跨进程发送与接收 TCopyDataStruct 数据 - 回复 skymesh
  3. 线程控制之线程和信号
  4. 关于MacBook电池的正确使用方法,和保养技巧
  5. 项目中的文件夹与tomcat/webapp中manager文件夹重名
  6. 模拟个密保卡的效果,没用JS框架
  7. 20.高性能MySQL --- 在MySQL上使用 Sphinx
  8. 20.Yii 工作流
  9. Noip前的大抱佛脚----文章索引
  10. Influx kafka