Linux下的进程

三个特殊的进程:idle(PID = 0), init(PID = 1),kthreadd(PID = 2)

idle进程(PID = 0)

  由系统自动创建 ,运行在内核态,是唯一一个没有通过 fork 或者 kernel_thread 产生的进程

init进程(PID = 1)

  由 idle 通过 kernel_thread 创建,在内核空间完成初始化后, 进入用户空间;进入用户空间后启动其他系统进程,最后变为守护进程监视系统其他进程。它是系统中所有用户进程的父进程,都由它来完成 fork 动作。

kthreadd(PID = 2)

  idle通过 kernel_thread 创建,并运行在内核空间, 负责所有内核线程的调度和管理


内核态与用户态

在这里插入图片描述
内核是控制计算机硬件,并提供上层应用程序的运行环境
运行于用户态的进程可以执行的操作和访问的资源都会受到极大的限制,而运行在内核态的进程则可以执行任何操作并且在资源的使用上没有限制


前台任务、后台任务、守护进程

  • 前台任务(foreground job)是独占命令行窗口的任务,只有运行完了或者手动中止该任务,才能执行其他命令。

  • 后台任务(background job),与前台任务相对应,在多任务系统中,有一些任务在运行的时候,并不需要与用户交互。它们通常在不打扰用户其它工作的时候默默地执行(此时可以输入其他的命令)。后台任务继承当前session(对话,就是终端窗口)的标准输出(stdout)和标准错误(stderr)。因此,后台任务的所有输出依然会同步地在命令行下显示。如果它试图读取标准输入,就会暂停执行(halt)。

  • 守护进程(daemon)是指在UNIX或其他多任务操作系统中在后台执行的电脑程序,并不会接受电脑用户的直接操控。此类程序会被以进程的形式初始化。守护进程程序的名称通常以字母“d”结尾:例如,syslogd就是指管理系统日志的守护进程。用户退出session之后,“后台进程是否会继续执行”是判定这一任务是否为“守护进程”的依据。

断开 session 进程是否会终止的讨论

  • 如果是前台进程,则一定会停止。
  • 如果是后台进程,则需要视对应的情况而定,具体可参考下面的链接。如果在一条命令行后加上 & ,则这条命令启动的进程是一个后台进程,断开session后,是否继续在 Linux 内执行,需要看该进程是否会收到会话窗口的SIGHUP信号,如果可以收到,则会结束。
  • 如果是使用 nohup … & 启动的守护进程,则不会被停止。

三种进程的更多介绍


fork函数复制进程

fork函数对进程的复制特点:

  1. fork函数在复制子线程的过程中,会有关于标准IO库是带缓冲的,缓存区未被刷新,将被子线程复制;缓存区被刷新,子线程不会复制到其中内容(标准输出(printf之类的)的缓冲区由换行符刷新,但换行符不会刷新文件的缓冲区)

  2. fork函数虽然复制了整个进程,但其是从fork的位置下,开始执行子进程的

  3. fork函数将返回一个pid,这个pid在父进程中是子进程的pid值,在子进程中pid为0

记住上面三条后,然后参考两个用例对其的解释:

fork函数关于缓冲区的代码用例及解释
fork函数深入介绍

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值