Linux C多进程编程基础

本文介绍了Linux C多进程编程的基础知识,涵盖了进程的关系、状态、描述符、标识符、以及进程创建、执行、退出和销毁的相关函数,如fork、vfork、wait和waitpid。文章详细阐述了进程状态的转换和进程控制块,强调了进程在系统中的生命周期和交互方式。
摘要由CSDN通过智能技术生成

关于进程概念相关的内容请打开链接,本文所介绍的是进程的POSIX标准。

进程的关系

       Linux中的所有进程都是相互联系的,进程之间的的从属关系有父/子关系和兄/弟关系。

       Linux内核创建了进程标号为0以及进程标号为1的进程。其中PID为1的进程是初始化进程init,Linux中的所有进程都是由其衍生而来的,在shell下执行程序启动的进程则是shell进程的子进程。进程可以再启动一个或多个进程,这样就形成了一颗进程树,每个进程都是树中的一个节点,其中树根就是初始化进程init。

       按进程的从属关系,进程分为以下几种(假设一个进程为P):

       ·祖先进程p_opptr(original parent):指向创建了进程P的进程的进程描述符,如果父进程不存在(例如已被销毁或从父进程中退出),则指向进程init的进程描述符。所以当一个shell用户启动了一个后台进程并从shell退出的时候,这个后台进程将变成init的子进程。

       ·父进程p_pptr(parent):指向创建了进程P的进程的进程描述符,其值通常来说和p_opptr一致,但也可能不同。

       ·子进程p_cptr(child):指向由进程P创建的进程中年龄最小(即创建时间最晚)的进程的进程描述符,即上一次创建的进程。

       ·兄进程p_osptr(older sibling):指向与P进程同属于一个父进程,但创建时间比P进程早的进程进程描述符。

       ·弟进程p_ysptr(younger sibling):与兄进程相对,指向与P进程同属于一个父进程,但创建时间比P进程较晚的进程。

进程的状态

       进程在其生存周期内可能处于以下状态中,且一个进程在同一时刻只能位于其中一个状态:

       ·可运行状态(TASK_RUNNING):占用处理器执行或准备执行。

       ·可中断的等待状态(TASK_INTERRUPTIBLE):进程被挂起或睡眠,当满足某些条件时才退出这种等待状态。这些条件包括:硬件中断、等待的资源被释放、传递一个信号灯,退出等待状态后会回到可运行态。

       ·不可中断的等待状态(TASK_UNINTERRUPTIBLE):和上一个状态相似,区别是当接收到信号时不能退出这个等待状态。

       ·暂停状态(TASK_STOPPING):进程的运行被暂停,通常来说是接收到SIGSTOP、SIGTTIN或者SIGTTOU信号后。如果一个进程被另外一个进程监控时,任何信号都可以把这个进程置于TASK_STOPPEN状态。

       ·僵尸状态(TASK_ZOMBIE):进程的执行已经被终止,但父进程还没有wait系列系统调用已返回的相应信息,此时内核不能丢弃与该进程有关的数据,因为父进程可能还需要这些数据。

       进程在这几种状态之间相互转化,但对于用户而言是透明的,这个切换的过程常被称为进程调度。进程是一个随执行过程不断变化的实体,和程序要包含指令和数据一样,进程也包含程序计数器和所有处理器寄存器的值,同时它的堆栈中存储着参数、返回地址以及变量之类的临时数据。在多处理机操作系统中,进程之间除了从属关系以外相对独立,如果系统中某个进程崩溃,不会影响到其余进程,每个进程运行在各自的虚拟地址空间中,通过一定的通信机制,它们之间才能发生联系。

进程描述符(进程控制块)

       为了对进程进行管理,Linux内核必须了解每个进程当前的执行状态,这些状态包括进程的优先级、运行状态、分配的地址空间等。为了达到这个目的,Linux内核提供了一个结构体task_struct来描述进程(或者说表示进程实体)。

struct task_struct {
    volatile long state;    //进程运行时的状态
  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值