我的编程空间,编程开发者的网络收藏夹
学习永远不晚

linux创建进程的命令有哪些

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

linux创建进程的命令有哪些

这篇“linux创建进程的命令有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“linux创建进程的命令有哪些”文章吧。

linux创建进程的命令:1、fork命令,可以从已存在进程中创建一个新进程,该新进程为子进程,而原进程为父进程;子进程完全复制父进程的资源。2、vfork命令,创建的子进程与父进程共享地址空间,也就是说子进程完全运行在父进程的地址空间上。3、clone命令,可以将父进程资源有选择地复制给子进程,而没有复制的数据结构则通过指针的复制让子进程共享。

Linux系统种创建进程有fork、vfork、clone这个三名命令可供使用。

fork

fork创建一个进程时,子进程只是完全复制父进程的资源,复制出来的子进程有自己的task_struct结构和pid,但却复制父进程其它所有的资源。例如,要是父进程打开了五个文件,那么子进程也有五个打开的文件,而且这些文件的当前读写指针也停在相同的地方。所以,这一步所做的是复制。这样得到的子进程独立于父进程, 具有良好的并发性,但是二者之间的通讯需要通过专门的通讯机制,如:pipe,共享内存等机制, 另外通过fork创建子进程,需要将上面描述的每种资源都复制一个副本。这样看来,fork是一个开销十分大的系统调用,这些开销并不是所有的情况下都是必须的,比如某进程fork出一个子进程后,其子进程仅仅是为了调用exec执行另一个可执行文件,那么在fork过程中对于虚存空间的复制将是一个多余的过程。但由于现在Linux中是采取了copy-on-write(COW写时复制)技术,为了降低开销,fork最初并不会真的产生两个不同的拷贝,因为在那个时候,大量的数据其实完全是一样的。写时复制是在推迟真正的数据拷贝。若后来确实发生了写入,那意味着parent和child的数据不一致了,于是产生复制动作,每个进程拿到属于自己的那一份,这样就可以降低系统调用的开销。所以有了写时复制后呢,vfork其实现意义就不大了。

  fork()调用执行一次返回两个值,对于父进程,fork函数返回子程序的进程号,而对于子程序,fork函数则返回零,这就是一个函数返回两次的本质。

  在fork之后,子进程和父进程都会继续执行fork调用之后的指令。子进程是父进程的副本。它将获得父进程的数据空间,堆和栈的副本,这些都是副本,父子进程并不共享这部分的内存。也就是说,子进程对父进程中的同名变量进行修改并不会影响其在父进程中的值。但是父子进程又共享一些东西,简单说来就是程序的正文段。正文段存放着由cpu执行的机器指令,通常是read-only的。

vfork

  vfork系统调用不同于fork,用vfork创建的子进程与父进程共享地址空间,也就是说子进程完全运行在父进程的地址空间上,如果这时子进程修改了某个变量,这将影响到父进程。

  因此,上面的例子如果改用vfork()的话,那么两次打印a,b的值是相同的,所在地址也是相同的。

  但此处有一点要注意的是用vfork()创建的子进程必须显示调用exit()来结束,否则子进程将不能结束,而fork()则不存在这个情况。

  Vfork也是在父进程中返回子进程的进程号,在子进程中返回0。

  用 vfork创建子进程后,父进程会被阻塞直到子进程调用exec(exec,将一个新的可执行文件载入到地址空间并执行之。)或exit。vfork的好处是在子进程被创建后往往仅仅是为了调用exec执行另一个程序,因为它就不会对父进程的地址空间有任何引用,所以对地址空间的复制是多余的 ,因此通过vfork共享内存可以减少不必要的开销。

clone

  系统调用fork()和vfork()是无参数的,而clone()则带有参数。fork()是全部复制,vfork()是共享内存,而clone() 是则可以将父进程资源有选择地复制给子进程,而没有复制的数据结构则通过指针的复制让子进程共享,具体要复制哪些资源给子进程,由参数列表中的 clone_flags来决定。另外,clone()返回的是子进程的pid。

下面详细了解fork命令(进程创建)。

深入 fork 函数

在 Linux 中 fork 函数是一个非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。

fork 函数的返回值:

  • 给父进程返回子进程的 pid

  • 给子进程返回0

接下来我们举例使用一下fork函数 ()

linux创建进程的命令有哪些

我们编译,然后运行一下:

linux创建进程的命令有哪些

fork 的常规用法

  • 一个父进程希望复制自己,使父子进程同时执行不同的代码段。例如,父进程等待客户端请求,生成子进程来处理请求。

  • 一个进程要执行一个不同的程序。例如子进程从fork返回后,调用exec函数。

fork调用失败的原因

  • 系统中有太多的进程

  • 实际用户的进程数超过了限制

在重温了一下 fork 函数的使用后,接下来我们来研究一个话题:

fork() 创建子进程,操作系统做了哪些操作?

进程调用 fork,当控制转移到内核中的fork代码后,内核做了以下操作:

  • 分配新得内存块和内核数据结构给子进程。

  • 将父进程部分数据结构内容拷贝至子进程。

  • 添加子进程到系统进程列表中。

  • fork返回,开始调度器调度。

linux创建进程的命令有哪些

父进程执行完 fork之前的代码(before)后,调用 fork 创建子进程,父子两个执行流分别执行。注意:fork 之后,谁先执行完全由调度器决定

这里还有一个问题,当fork之后,父子进程代码共享是 after 共享,还是所有代码都进行共享?为什么子进程总准确地执行 fork 之后对应的代码?

答案: 所有代码共享,因为CPU记录了进程的执行位置。

  • 代码进行汇编之后,会有很多行代码,而且每行代码加载到内存之后,都有对应的地址。

  • 因为进程随时都可能被中断(可能并没有执行完),下次继续执行时,还必须从之前的位置继续运行(并不是程序最开始或main函数处),这就要求 CPU 必须实时记录下当前进程执行的位置。

  • 所以,CPU内有对应的寄存器数据,用来记录当前进程的执行位置,此寄存器叫做EIP,也称作为pc(point code 程序计数器),用来记录正在执行代码的下一行代码的地址(上下文数据)。

  • 当子进程创建时,会修改其EIP。此时子进程便会认为EIP的中保存下的数据,就是要执行的代码。


创建子进程时,操作系统给子进程分配对应的数据结构,子进程独立运行,因为进程具有独立性。

理论上,子进程也要有自己的代码和数据,但是一般而言,创建子进程没有加载的过程,子进程本身并没有自己的代码和数据。

所以,子进程只能 "使用" 父进程的代码和数据,而代码是只读的,父子共享不会冲突;而数据是可能被修改的,必须进行分离。

这时,操作系统便采用写时拷贝的策略。

写时拷贝

linux创建进程的命令有哪些

OS 为何采用写时拷贝技术,对父子进程进行分离

  • 写入时再进行拷贝,是高效使用内存的一种表现。

  • 提高了系统的运行效率。

  • OS无法在代码执行前预知哪些空间会被访问。

扩展知识:进程终止和

进程终止

当进程终止时,操作系统释放了进程申请的相关内核数据结构和对应的代码的数据,其本质就是释放系统资源,

1、进程退出码

进程终止的常见方式:

  1. 代码跑完,结果正确。

  2. 代码跑完,结果不正确。

  3. 代码没有跑完,程序崩溃了。

区分第一种情况和第二种情况我们可以通过进程的退出码很清晰的辨别。

关于学习的 C语言中 main 函数的返回值,其中 main 函数的返回值就是进程的退出码。其意义是返回给上一级进程,用来评判该进程执行结果。

现在我们编写一个简单的 C 程序。

linux创建进程的命令有哪些

然后我们可以通过 echo $? 获取最近一个进程的退出码。

linux创建进程的命令有哪些

进程的返回值有 0 和非0两种情况,其中 0 表示程序成功运行并结果正确,而非0表示成功运行但结果有误,非零值有无数个,不同的非零值就可以就表示着不同的错误,方便我们定义错误的原因。

那常见的错误信息有哪些呢?

我们可以使用 strerror 将其打印出来

linux创建进程的命令有哪些

结果如下:

linux创建进程的命令有哪些

linux创建进程的命令有哪些

发现 linux 下,共有133条错误码

当然,程序崩溃的时候,退出码没有意义。

众所周知,Linux 是用C语言写的,其中命令本质就是C语言程序,所以我们可以简单的拿 ls 命令来举例

linux创建进程的命令有哪些

而 2 号退出码对应的报错信息:

linux创建进程的命令有哪些

2、exit 与 _exit

关于终止一个进程可以使用 return 语句,还可以调用 exit 和 _exit 函数

exit函数:

linux创建进程的命令有哪些

_exit函数:

linux创建进程的命令有哪些

关于这两个函数的区别有很多,我们先举一个小例:

我们接下来使用 printf 打印一条信息,然后sleep三秒,再使用 exit 退出,并观察结果

linux创建进程的命令有哪些

因为我们带上了 \n ,加上 \n 会刷新缓冲区,屏幕上即出现我们打印的内容。

linux创建进程的命令有哪些

如果我们不带上 \n ,我们再观察结果:

linux创建进程的命令有哪些

发现:因为没有 \n ,所以 printf 中的内容并没有在休眠前被打印出来,而是调用 exit 后将缓冲区的内容刷新出来输出在屏幕上。

接下来我们使用 _exit 函数

linux创建进程的命令有哪些

运行可执行文件 b:

linux创建进程的命令有哪些

发现什么内容都没有被打印出来,使用 echo $? 打印最近进程退出码,发现 b 文件确实被执行了。

这说明,exit是库函数,而_exit 是系统调用,其退出进程时并没有刷新缓冲区中的内容。

linux创建进程的命令有哪些

此时我们便能得出一个结论:

printf 数据是保存在"缓冲区"中的,exit可以将其刷新,而系统调用接口_exit不能将其刷新。所以,缓冲区必定不在操作系统内部,而是由C标准库维护的。

以上就是关于“linux创建进程的命令有哪些”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网服务器栏目。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

linux创建进程的命令有哪些

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

linux创建进程的命令有哪些

这篇“linux创建进程的命令有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“linux创建进程的命令有哪些”文章吧。
2023-03-13

Linux中有哪些创建用户命令

这篇文章给大家介绍Linux中有哪些创建用户命令,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Linux创建用户useradd或adduser命令用来建立用户帐号和创建用户的起始目录,使用权限是超级用户。创建用户use
2023-06-09

Linux进程管理的命令有哪些

这篇文章主要介绍“Linux进程管理的命令有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Linux进程管理的命令有哪些”文章能帮助大家解决问题。1.ps‘ps’是Lin
2023-06-28

Linux系统创建文件命令有哪些

这篇文章主要介绍Linux系统创建文件命令有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、touch命令  linux的touch命令不常用,一般在使用make的时候可能会用到,用来修改文件时间戳,或者新建一
2023-06-28

Linux进程管理命令有哪些

这篇“Linux进程管理命令有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Linux进程管理命令有哪些”文章吧。执行中
2023-06-27

Linux系统创建文件夹命令有哪些

小编给大家分享一下Linux系统创建文件夹命令有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!#单个文件夹创建mkdir 文件夹名称#例如:mkdir wen
2023-06-28

linux中创建子进程的方式有哪些

在Linux中,有以下几种方式可以创建子进程:1. 使用fork()系统调用:fork()系统调用会创建一个与父进程完全相同的子进程。子进程从父进程继承了大部分资源,包括代码段、数据段、打开的文件描述符等。通过fork()系统调用,可以通过
2023-09-11

Linux系统查看进程命令有哪些

这篇文章主要为大家展示了Linux系统查看进程命令有哪些,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“Linux系统查看进程命令有哪些”这篇文章吧。1.psps是Linux 中最基础的浏览系统中的
2023-06-28

mysql创建表结构的命令有哪些

答案:使用 create table 语句创建表结构。详细描述:create table 语句用于创建一个新表,其中包含列名、数据类型和约束条件。数据类型包括:数值类型、字符类型、日期和时间类型、二进制类型。约束条件限制表中的数据,包括:n
mysql创建表结构的命令有哪些
2024-04-22

Linux中常用的进程管理命令有哪些

本篇内容主要讲解“Linux中常用的进程管理命令有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux中常用的进程管理命令有哪些”吧!1.ps‘ps’是Linux
2023-06-27

linux命令有哪些

linux命令有哪些,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、文件系统的管理tips:输入命令的时候要常用tab键来补全ls 查看目录信息 ( ls / ) ls
2023-06-09

Linux系统中查看tomcat进程命令有哪些

这篇文章主要介绍了Linux系统中查看tomcat进程命令有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。很多小伙伴在查看tomcat进程时常常会把ps -ef|grep
2023-06-28

linux文件创建命令是哪个

这篇文章主要介绍了linux文件创建命令是哪个的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇linux文件创建命令是哪个文章都会有所收获,下面我们一起来看看吧。文件创建命令是:1、“vi 文件名”命令,该命令输
2023-06-29

Linux系统查看进程占用io命令有哪些

这篇“Linux系统查看进程占用io命令有哪些”文章,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要参考一下,对于“Linux系统查看进程占用io命令有哪些”,小编整理了以下知识点,请大家跟着小编的步伐一步一步的慢慢
2023-06-28

Linux nohup命令有哪些

这篇文章将为大家详细讲解有关Linux nohup命令有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。导读在工作中,我们很经常跑一个很重要的程序,有时候这个程序需要跑好几个小时,甚至需要
2023-06-05

Linux dos命令有哪些

本篇内容主要讲解“Linux dos命令有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux dos命令有哪些”吧!dos命令大全常用命令:(1)查看目录内容命令 DIR(2)指定可执
2023-07-01

Linux中有哪些有趣的命令

这篇文章主要介绍“Linux中有哪些有趣的命令”,在日常操作中,相信很多人在Linux中有哪些有趣的命令问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux中有哪些有趣的命令”的疑惑有所帮助!接下来,请跟
2023-06-27

编程热搜

目录