当前位置: 首页 > news >正文

linux下的进程,fork、exec函数族简介

 进程相关概念

        程序和进程
程序:是指编译好的二进制文件,在磁盘上,占用磁盘空间, 是一个静态的概念.
进程:一个启动的程序, 进程占用的是系统资源,如:物理内存,CPU,终端等,是一个动态的概念

进程状态

        进程基本的状态有5种。分别为初始态,就绪态,运行态,挂起态与终止态。其中初始态为进程准备阶段。

PCB:进程控制块

        进程控制块(Process Control Block,PCB)是操作系统中用于管理和控制进程的重要数据结构。每当操作系统创建一个新进程时,它会为该进程分配一个 PCB,其中包含了与该进程相关的所有信息。Linux内核的进程控制块是task_struct结构体。
       
        vim /usr/src/linux-headers-6.8.0-45/include/linux/sched.h  #6.8.0-45linux版本替换成自己的电脑上的版本   进入这个文件可以查看task_struct结构体的定义。

        task_struct结构体内部成员有很多,我们重点掌握以下部分即可:
进程id。系统中每个进程有唯一的id,在C语言中用pid_t类型表示,其实就是一个非负整数。
进程的状态,有就绪、运行、挂起、停止等状态。
描述虚拟地址空间的信息。
进程切换时需要保存和恢复的一些CPU寄存器。
文件描述符表,包含很多指向file结构体的指针。
用户id和组id。
进程可以使用的资源上限(Resource Limit):使用ulimit -a 命令可以查看

并行和并发

        并发,在一个时间段内, 是在同一个cpu上, 同时运行多个程序。
        如:若将CPU的1S的时间分成100个时间片,每个进程执行完一个时间片必须无条件让出CPU的使用权,这样1S中就可以执行100个进程。高并发可以简单理解为是在有限时间内,系统能够处理尽可能多的进程或请求。
        并行指两个或两个以上的程序在同一时刻发生(需要有多颗cpu,现在我们电脑的cpu都是多核)。就是说,有多个cpu上同时运行着不同程序。

fork函数

        函数作用:创建子进程
原型: pid_t fork(void);
使用时需要包含头文件:#include <unistd.h>
函数参数:无
返回值:调用成功:父进程返回子进程的PID,是一个大于0的数;
              子进程返回0。
注意:不是fork函数在一个进程中返回两个值,而是在父子进程各自返回一个值。
fork函数原理图:(PCB在上边有介绍)

子进程创建成功后,代码的执行位置?
        
进程会从 fork() 调用后的下一行代码开始继续执行。这意味着,在 fork() 后面有条件判断或逻辑分支,可以通过检查 fork() 的返回值来确定当前是在父进程还是在子进程中。
如何区分父子进程?
        
通过fork函数的返回值
父子进程的执行顺序?
        
不一定,哪个进程先抢到CPU,哪个进程就先执行。
fork函数代码简单实例:调用fork函数创建子进程,分别打印出子进程pid和父进程pid等。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>int main(void)
{printf("before fork,pid[%d]\n",getpid());pid_t pid = fork();printf("test\n");if(pid<0){perror("fork error");return -1;}else if(pid>0){printf("father:[%d],pid =[%d],fpid=[%d]\n",pid,getpid(),getppid());}else if(pid==0){	printf("child:pid =[%d],fpid=[%d]\n",getpid(),getppid());}printf("after fork,pid:[%d]\n",getpid());return 0;}

运行结果如下:


http://www.mrgr.cn/news/62350.html

相关文章:

  • GDB(GNU Debugger)的使用教程
  • JUC入门学习笔记
  • Python+Selenium+Pytest+POM自动化测试框架封装(完整版)
  • 【C语言刷力扣】3216.交换后字典序最小的字符串
  • Spring Boot集成iText实现电子签章
  • Excel 单元格小数点精确位数机制
  • 如何查看磁盘的类型?(固态硬盘 or 机械硬盘)
  • 【大模型之Graph RAG系列之一】由谷歌搜索的演进看知识图谱如何改进RAG技术
  • 《云计算网络技术与应用》实训8-1:OpenvSwitch简单配置练习
  • 百度集度嵌入式面试题及参考答案
  • JS实现图片放大镜效果
  • 我docker拉取mysql镜像时用的是latest,我该怎么看我的镜像版本是多少?可以通过一下三种方法查看
  • 用Python下载指定URL的图片并保存到本地
  • Mybatis缓存
  • 四足机器人实战篇之十:cheetah mini运动控制工程解读(附C++代码)
  • JAVA——多线程
  • JAVA程序导致cpu标高排查
  • 微服务设计模式 — 补偿事务模式(Compensating Transaction Pattern)
  • 基于java+SpringBoot+Vue的网上租贸系统设计与实现
  • Java8中CompletableFuture.allOf的使用
  • Python飞舞蝙蝠
  • 迪杰斯特拉算法(Dijkstra‘s Algorithm
  • Vue学习记录之二十七 Pinia的使用
  • 97、Python并发编程:多线程实现的两种方式
  • 串口屏控制的自动滑轨
  • 【MySQL】 运维篇—安全管理:数据加密与SSL配置