Linux系统编程—进程

2023-05-16

一、相关概念

1、进程与程序:程序是一个静态的概念。如gcc xxx.c -o pro ,磁盘中生成的Pro文件,叫做程序。进程就是程序运行起来,系统中就多了一个进程。

2、查看进程的方法

        (1)可以通过ps指令查看:ps -aux (查看所有包括其他使用者的进程)

        (2)可以使用top指令查看。(类似于Windows任务管理器)

3、进程标识符

        每一个进程都有一个非负整数表示的唯一ID,叫做pid,类似身份证。

                (1)pid = 0:成为交换进程,作用为进程调度。

                (2)pid = 1:init进程,作用为系统初始化。

        编程可以调用getpid函数获取自身的进程标识符,getppid获取父进程的进程标识符。

4、父进程与子进程:A进程创建了B进程,则A为父进程B为子进程。

        环境变量(传给子进程的变量,遗传性是本地变量和环境变量的根本区别)只能单向从父进程传给子进程。不管子进程的环境变量如何变化,都不会影响父进程的环境变量。

5、存储空间的分配:对于老版Linux,是全部复制。对于新版Linux,是对不改变值得采用共享,当改变的时候复制。

        (1)正文段:这是由CPU执行的机器指令部分。通常,正文段是可共享的,所以即使是频繁执行的程序(如文本编辑器、c编辑器颌shell等)在存储器中也只需有一个副本,另外,正文段通常是只读的,以防程序由于意外而修改其自身的指令。  

        (2)初始化数据段

        (3)非初始化数据段:通常将此段成为bss段(“block started by symbol”由符号开始的块)

        (4)栈:局部变量、自动变量以及每次函数调用时所保存的信息都存放在此段中,每次调用函数时其返回值以及调用者的环境信息(例如机器寄存器的值)都存放在栈中 。然后,最近被调用的函数在栈上为其自动和临时变量分配空间。通过这种方式使用栈,可以递归调用c函数。

        (5)堆:通常在堆中进行动态存储分配。例如malloc函数。     

二、创建进程

1、fork函数

目的:(1)一个父进程希望复制自己,使父、子进程同时执行不同的代码段。这在网络服务进程中是常见的——父进程等待客户端的服务请求。当请求到达时使用fork函数,使子进程处理此请求。父进程则继续下一个服务请求到达。

        (2)一个进程要执行一个不同的程序。这对shell是常见的情况。在这种情况下,子进程从fork返回后立即调用exec。

 函数:(1)fork函数被调用一次,但是返回两次,并且值在不同的进程中。因为一个进程的子进程可以有多个,所以该函数的返回值在父进程中返回子进程的pid,可以方便我们区分不同的子进程。因为只能有一个父进程,所以在子进程中返回0。同时也可以通过返回值来区分改进程为子进程还是父进程。

        (3)使用该函数之后,子进程是父进程的副本,获得父进程数据空间、堆和栈的副本。注意父子进程不共享这些空间,只共享正文段。

2、vfork函数

        (1)子进程直接使用父进程的内存空间

        (2)由于内存空间不进行拷贝,所以子进程先运行等子进程调用exit函数退出后,父进程才执行。

三、退出进程

1、正常退出:main函数中调用return、exit()、_exit()、_Exit()。(其中后两种属于系统调用)

     异常退出:调用abort、(当进程受到某些信号时,如ctrl+c)、最后一个线程对取消指令做出响应。

        在任意一种情况下,该终止进程的父进程都能用wait或waitpid函数取得其终止状态。

2、exit、_exit的区别

        _exit()函数的作用最为简单:直接使进程停止运行,清除其使用的内存空间,并销毁其在内核中的各种数据结构;exit() 函数则在这些基础上作了一些包装,在执行退出之前加了若干道工序,也是因为这个原因,有些人认为exit已经不能算是纯粹的系统调用。(0表示成功,非0表示失败)

        exit()函数与_exit()函数最大的区别就在于exit()函数在调用exit系统调用之前要检查文件的打开情况,把文件缓冲区中的内容写回文件,就是”清理I/O缓冲”。

3、在进程中exit、_exit的使用

        ‘exit()’与‘_exit()’有不少区别在使用‘fork()’,特别是‘vfork()’时变得很突出。

‘        exit()’与‘_exit()’的基本区别在于前一个调用实施与调用库里用户状态结构(user-mode constructs)有关的清除工作(clean-up),而且调用用户自定义的清除程序 (自定义清除程序由atexit函数定义,可定义多次,并以倒序执行),相对应,_exit函数只为进程实施内核清除工作。

        在由‘fork()’创建的子进程分支里,正常情况下使用‘exit()’是不正确的,这是 因为使用它会导致标准输入输出(stdio: Standard Input Output)的缓冲区被清空两次,而且临时文件被出乎意料的删除(临时文件由tmpfile函数创建在系统临时目录下,文件名由系统随机生成)。在C++程序中情况会更糟,因为静态目标(static objects)的析构函数(destructors)可以被错误地执行。(还有一些特殊情况,比如守护程序,它们的父进程需要调用‘_exit()’而不是子进程;适用于绝大多数情况的基本规则是,‘exit()’在每一次进入‘main’函数后只调用一次。

四、进程的相关状态及转换

1、R (TASK_RUNNING),可执行状态

2、S (TASK_INTERRUPTIBLE),可中断的睡眠状态

3、D (TASK_UNINTERRUPTIBLE),不可中断的睡眠状态

4、T/t (TASK_STOPPED or TASK_TRACED),暂停状态或跟踪状态

5、Z (TASK_DEAD - EXIT_ZOMBIE),退出状态,进程成为僵尸进程

6、X (TASK_DEAD - EXIT_DEAD),退出状态,进程即将被销毁

五 、等待子进程

注:若子进程的退出状态不被收集,则会变成僵死进程(僵尸进程)。waitpid中的WNOHANG也会使子进程变成僵尸进程。

1、相关函数

        (1)wait函数:如果其所有子进程都还在运行,则阻塞。

                                   如果一个子进程已终止,正等待父进程获取其终止状态,则取得该子进程终止状态立即返回。

                                   如果他没有任何子进程,则立即出错返回。

        (2)waitpid函数:

                参数:status参数: 是一个整型数指针

                                                非空: 子进程退出状态放在它所指向的地址中。

                                                空: 不关心退出状态

                        pid参数:

                         options参数:(其中WNOHANG可以使调用者不阻塞,但是会使结束的子进程为僵尸进程)

2、检查wait和waitpid所返回的终止状态的宏

3、若父进程不等待子进程退出,在子进程退出之前就结束,此时子进程叫做孤儿进程。Linux避免存在过多的孤儿进程,则会使init进程收留孤儿进程,init进程变成孤儿进程的父进程。 

六、exec族函数:linux进程---exec族函数(execl, execlp, execle, execv, execvp, execvpe)_云英的博客-CSDN博客_execlp函数

        其中路径只为打开可执行文件,不给文件输送任何参数。

返回值:
  exec函数族的函数执行成功后不会返回,调用失败时,会设置errno并返回-1,然后从原程序的调用点接着往下执行。

        其中设置的errno可以调用perror函数查看具体错误。如下面程序所示

输出结果为: 

七、system函数:

        linux system函数详解 - 南哥的天下 - 博客园

        该函数实际为execl函数的包装,当system执行完毕后,随即返回原调用的进程。

        此函数的缺点为无法获得调用出的内容,无法进行保存和读取。 

八、popen函数:

        linux下popen的使用心得_libinbin_1014的博客-CSDN博客

        此函数的优点为可以获得指令产生的结果或内容。

        当调用成功是需要使用pclose关闭FILE*

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux系统编程—进程 的相关文章

  • 解决The package java.awt is not accessible

    第一次写这个东东 xff0c 也不会有人看 xff0c 随缘记录点东西 最近开始学java xff0c 用了eclipse IDE xff0c 但是在用awt和swing包的时候报错 xff0c The package java awt i
  • 社区版Idea的Configuration中没有spring boot选项

    专业版Idea自带springinitialler xff0c 创建spring boot项目时也会自动识别为spring boot项目 但社区版没有这个功能 xff0c 但可以同在plugins中下载spring assistant代替s
  • 运行java -version出错 Error could not open `libamd64jvm.cfg

    运行javac正常 xff0c 运行运行java version出错 Error could not open 96 libamd64jvm cfg 解决办法 xff0c 找到这个目录 C Program Files x86 Common
  • 项目启动报错Redis health check failed:Unable to connect to localhost6379

    报错详情 分析解决 我项目里面并没有引redis的连接 xff0c 那么报错这个就很奇怪 xff0c 结合Redis health check failed这句 xff0c 猜测是哪个东西里面引入了redis xff0c 然后做了redis
  • 中文乱码问题

    解决HTML的表单中文乱码问题 step1 在html文件中 xff0c 添加 lt meta http equiv 61 content type content 61 text html charset 61 utf 8 gt 另外 x
  • IDEA mybatis XML文件格式化问题

    IDEA mybatis XML文件格式化问题 问题描述问题定位解决方案 问题描述 在Idea中 xff0c 对mybatis的xml文件进行格式化 xff0c 格式化的排版并不是我们想要的 xff0c 如下图 xff1a 问题定位 SQL
  • C#.NET视频C#网络编程 基础篇

    C NET视频 C 网络编程 基础篇 11 P2P应用编程下 C 网络编程 基础篇 9 同步TCP接收电子邮件 C 网络编程 基础篇 8 UDP网络会议 C 网络编程 基础篇 7 UDP组播 C 网络编程 基础篇 6 UDP广播 C 网络编
  • docker Got permission denied while trying to connect to the Docker daemon socket at unix

    为了让普通用户也能操作docker容器 xff0c 需要进行相应的配置 xff0c 否则报 Got permission denied while trying to connect to the Docker daemon socket
  • Dubbo+Zookeeper入门实例

    现在的公司接口调用是通过dubbo来实现的 xff0c 所以这两天就了解了一下dubbo是如何进行通信的 xff0c 写了一个最简单的例子 自上得来终觉浅 xff0c 绝知此事要躬行 前言 dubbo介绍 Dubbo是一个分布式服务框架 x
  • Dubbo之注册与发现

    从官网可以得到下面的架构图 角色说明 Provider 暴露服务的服务提供方 Consumer 调用远程服务的服务消费方 Registry 服务注册与发现的注册中心 Monitor 统计服务的调用次调和调用时间的监控中心 Container
  • dubbo泛化调用 http接口 随意调用dubbo服务

    dubbo支持泛化调用 1 开发工程中 有时候想要测试dubbo接口 需要自定义用例 xff0c 比较麻烦 2 无法调用服务器上的dubbo测试 3 无法随意调用多版本的服务 由于dubbo支持泛化调用 所以这些问题就迎刃而解了 Copyr
  • eclipse打包springboot项目

    eclipse打包springboot项目 右键项目run as中的maven build 输入clean package
  • elasticsearch7.x在k8s中的部署

    目录 一 说明 二 思路 三 部署 1 建nfs服务器 2 建持久卷 3 部署elasticsearch 四 附件 pv yaml内容 elasticsearch yaml内容 一 说明 本文章内容主要的参考来源是https www cnb
  • ERROR 2002 (HY000) Can‘t connect to local MySQL server through socket ‘varrunmysqldmysqld.sock‘

    今天执行mysql操作的时候出现了错误 xff1a ERROR 2002 HY000 Can t connect to local MySQL server through socket 39 var run mysqld mysqld s
  • HADDOP安装配置过程(新手初学)

    最近刚开始学习HADOOP xff0c 跟着一个视频初步了解了一些HADOOP的基本的安装过程 xff0c 感觉有必要总结一下 xff0c 以便后续可以温习一下 外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直接上传 img X
  • 重定向与转发

    什么是重定向 服务器向浏览器发送一个状态码302及一个消息头location xff0c 浏览器收到后 xff0c 会立即向 location所指向的地址发送请求 2 如何重定向 response sendRedirect String u
  • Hadoop家族学习路线图

    主要介绍Hadoop家族产品 xff0c 常用的项目包括Hadoop Hive Pig HBase Sqoop Mahout Zookeeper Avro Ambari Chukwa xff0c 新增加的项目包括 xff0c YARN Hc
  • ElasticSearch查询大于10000条的数据

    注 xff1a 部分概念介绍来源于网络 在使用es进行数据查询时 xff0c 由于es官方默认限制了索引一次性最多只能查询10000条数据 xff0c 查询第10001条数据开始就会报错 xff0c 错误的内容大致为 xff1a Resul
  • IDEA2021.3设置全局maven

    1 打开IDEA xff0c 点击File gt Close Project 2 关闭项目后出现如下界面 xff0c 点击 Customize gt All settings 3 在左侧搜索框内搜索maven 3 1更改Maven home
  • java -jar 参数说明

    jvm 选项 Java启动参数共分为三类 xff1b 其一是标准参数 xff0c 所有的JVM实现都必须实现这些参数的功能 xff0c 而且向后兼容 xff1b 其二是非标准参数 X xff0c 默认jvm实现这些参数的功能 xff0c 但

随机推荐

  • java 获取当前时间的三种方法

    1 通过Util包中的Date获取 Date date 61 new Date SimpleDateFormat dateFormat 61 new SimpleDateFormat 34 yyyy MM dd hh mm ss 34 Sy
  • Java中json字符串转换成maplist

    import java util ArrayList import java util HashMap import java util Iterator import java util List import java util Map
  • Java基础知识(知识点)

    1 Java是一种高级计算机语言 xff0c 是可以编写跨平台应用软件 完全面向对象的程序设计语言 2 Java划分为三个技术平台 xff1a Java SE Java EE Java ME Java SE是桌面应用 xff0c Java
  • Java short数据类型

    短 short 整型数据类型是16位有符号Java原始整数数据类型 其范围是 32768至32767 或 2 15至2 15 1 short整型数据类型没有字面量 但是 xff0c 可以将任何位于short 32768到32767 范围内的
  • Java面试题内容聚合

    往期内容聚合 设计模式内容聚合 面试技术文 Java岗 面试考点精讲 xff08 基础篇01期 xff09 Java岗 面试考点精讲 xff08 基础篇02期 xff09 Java岗 面试考点精讲 xff08 网络篇03期 xff09 Ja
  • JVM原理和优化

    JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java exe来完成 通过下面4步来完成JVM环境 1 创建JVM装载环境和配置 2 装载JVM dll 3 初始化JVM dll并挂界到JNIENV JNI调用接口 实例 4
  • 抽象类与接口

    抽象方法 xff1a 只有行为的概念 xff0c 没有具体的行为实现 1 使用 xff1a abstract 关键字修饰 xff0c 并且没有方法体 2 包含抽象方法的类 xff0c 就一定是抽象类 3 抽象类不能直接创建实例 可以定义引用
  • Linux 下查看java进程

    Linux下查看和停止所有java进程 1 ps ef grep java 在Linux下查看所有java进程命令 xff1a ps ef grep java 停止特定java进程命令 xff1a kill 9 java进程序号 停止所有j
  • SpringCloud + Oauth2.0 + ShiroRedis + JWT + Gateway + Nacos + Nginx + ant-design-vue 电商 java 项目

    该项目是一套电商系统 xff0c 包括前台商城系统及后台管理系统 xff0c 基于SpringBoot 43 MyBatis实现 xff0c 采用Docker容器化部署 前台商城系统 xff1a 首页 商品推荐 商品搜索 商品展示 购物车
  • JavaEE进阶 - Spring Boot 日志文件 - 细节狂魔

    文章目录 1 志有什么 xff1f 2 志怎么 xff1f 3 自定义日志打印 准备工作 xff1a 创建一个 Spring Boot 项目 并在其中创建一个UserController类 xff0c 用来演示 在程序中得到 志对象 常 的
  • Spring注解详解

    一 Spring注解驱动开发入门 spring在2 5版本引入了注解配置的支持 xff0c 同时从Spring 3版本开始 xff0c Spring JavaConfig项目提供的许多特性成为核心Spring框架的一部分 因此 xff0c
  • hadoop启动HDFS命令

    启动命令 xff1a hadoop sbin start dfs sh 停止命令 xff1a hadoop sbin stop dfs sh
  • 女生学java开发难吗?女生适合学java吗?

    女生学java开发 xff1f Java开发看上去是一项系统性很强 入门很难的 高大上 学科 xff0c 前端 代码这些普通人基本不会接触到的名词 xff0c 吓怕了众多初学者 大部分人对于Java程序员都有一个既定印象 xff0c 那就是
  • 女生学java软件开发怎么样?就业前景如何?

    学java目前现状是男生多于女生 xff0c 从事java工作的也是男生多于女生 xff0c 那么这种现状是说女生学java不好找工作吗 一 女生适合从事java吗 在很多人的潜意识里 xff0c 认为女生是不适合从事java工作的 xff
  • 【 Docker Desktop stopped...】--------已经解决

    windows10系统 xff0c 安装docker 4 6 1版本 xff0c 提示Docker Desktop stopped xff0c 如图所示 在Stackoverflow有此问题 xff0c 底下给出的解决方案是卸载4 6 1版
  • JVM参数配置详解

    JVM调优总结 默认设置 Xms为JVM启动时申请的最小内存 xff0c 默认为操作系统物理内存的1 64但小于1G Xmx为JVM可申请的最大内存 xff0c 默认为物理内存的1 4但小于1G xff0c 默认当空余堆内存小于40 时 x
  • 认识MyBatis与Mybatis-plus及两者的区别

    一 认识Mybatis MyBatis 是持久层框架 xff0c 它支持定制化 SQL 存储过程以及高级映射 MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集 MyBatis 可以使用简单的 XML 或注解来配置
  • 线程

    创建线程 xff1a 方法一 xff09 继承Thread类 实现步骤 xff1a 继承Thread类 覆盖run 方法 提供并发运程的过程 创建这个类的实例 使用start 方法启动线程 xff08 方法二 xff09 实现Runnabl
  • Linux中实现cp命令

    一 main函数的原型 main int argc char argv argc是所有参数的总数量 argv为参数 如该程序所示 xff1a 程序运行结果如图所示 xff1a 二 实现cp指令的思路 1 打开src c 2 通过lseek函
  • Linux系统编程—进程

    一 相关概念 1 进程与程序 xff1a 程序是一个静态的概念 如gcc xxx c o pro xff0c 磁盘中生成的Pro文件 xff0c 叫做程序 进程就是程序运行起来 xff0c 系统中就多了一个进程 2 查看进程的方法 xff1