• Linux——进程


    目录

    一、基本概念

    二、描述进程-PCB

    (一)task_struct-PCB的一种

    (二)task_ struct内容分类

    三、查看进程

    (一)利用ps命令 

    (二) 通过 /proc 系统文件夹查看

    (三)proc是动态目录结构,存放所有存在的进程,目录的名称,就是以这个进程的id命名

    四、通过系统调用获取进程标示符(getpid和getppid)

    (一)下载getpid手册

    (二)使用getpid

    (三)使用getppid

    五、通过系统调用创建进程-fork

    (一)认识fork

    (二)fork有两个返回值

    (三)用 if 进行分流


    一、基本概念

    • 课本概念:程序的一个执行实例,正在执行的程序等
    • 内核观点:担当分配系统资源(CPU时间,内存)的实体
    • 进程 = 可执行程序 + 内核数据结构(PCB)

    二、描述进程-PCB

    • 进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合
    • 课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct

    (一)task_struct-PCB的一种

    • Linux中描述进程的结构体叫做task_struct
    • task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息
    1. struct task_struct
    2. {
    3. /* these are hardcoded - don't touch */
    4. long state; /* -1 unrunnable, 0 runnable, >0 stopped */
    5. long counter;
    6. long priority;
    7. long signal;
    8. struct sigaction sigaction[32];
    9. long blocked; /* bitmap of masked signals */
    10. /* various fields */
    11. int exit_code;
    12. unsigned long start_code, end_code, end_data, brk, start_stack;
    13. long pid, father, pgrp, session, leader;
    14. unsigned short uid, euid, suid;
    15. unsigned short gid, egid, sgid;
    16. long alarm;
    17. long utime, stime, cutime, cstime, start_time;
    18. unsigned short used_math;
    19. /* file system info */
    20. int tty; /* -1 if no tty, so it must be signed */
    21. unsigned short umask;
    22. struct m_inode *pwd;
    23. struct m_inode *root;
    24. struct m_inode *executable;
    25. unsigned long close_on_exec;
    26. struct file *filp[NR_OPEN];
    27. /* ldt for this task 0 - zero 1 - cs 2 - ds&ss */
    28. struct desc_struct ldt[3];
    29. /* tss for this task */
    30. struct tss_struct tss;
    31. };
    1. // tty 等待队列数据结构。
    2. struct tty_queue
    3. {
    4. unsigned long data; // 等待队列缓冲区中当前数据指针字符数[??])。
    5. // 对于串口终端,则存放串行端口地址。
    6. unsigned long head; // 缓冲区中数据头指针。
    7. unsigned long tail; // 缓冲区中数据尾指针。
    8. struct task_struct *proc_list; // 等待进程列表。
    9. char buf[TTY_BUF_SIZE]; // 队列的缓冲区。
    10. };

    (二)task_ struct内容分类

    • 标示符: 描述本进程的唯一标示符,用来区别其他进程。
    • 状态: 任务状态,退出代码,退出信号等。
    • 优先级: 相对于其他进程的优先级。
    • 程序计数器: 程序中即将被执行的下一条指令的地址。
    • 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
    • 上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
    • I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
    • 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
    • 其他信息

    三、查看进程

    (一)利用ps命令 

    ps ajx//列出所有用户的所有进程的详细信息

    1. ps ajx | head -1 && ps ajx | grep mybin
    2. //ps ajx | head -1 获取当前运行的所有进程的列标题
    3. //ps ajx | grep mybin 在所有进程中寻找包含关键词 "mybin" 的进程

    (二) 通过 /proc 系统文件夹查看

    ls /proc/  ---用于列出系统中所有正在运行的进程的相关信息

    (三)proc是动态目录结构,存放所有存在的进程,目录的名称,就是以这个进程的id命名

    ls /proc/7976 -dl//显示进程ID为7976的进程的目录信息,而不显示目录中的内容

    四、通过系统调用获取进程标示符(getpid和getppid)

    • 进程id(PID)
    • 父进程id(PPID)

    (一)下载getpid手册

    sudo yum install -y man-pages

    (二)使用getpid

    1. #include
    2. #include
    3. #include
    4. int main()
    5. {
    6. int i = 0;
    7. while (i <= 100)
    8. {
    9. pid_t id = getpid();
    10. printf("My process id is:%d\n", id);
    11. sleep(1);
    12. }
    13. return 0;
    14. }

     使用kill

    kill -9 32212//强制终止PID为32212的进程(-9表示强制)

    (三)使用getppid

    1. #include
    2. #include
    3. #include
    4. int main()
    5. {
    6. int i=0;
    7. while(i<=100)
    8. {
    9. printf("I am a process, myid: %d, parent id: %d\n",getpid(),getppid());
    10. sleep(1);
    11. }
    12. return 0;
    13. }

    五、通过系统调用创建进程-fork

    (一)认识fork

    while :;do ps ajx | head -1 && ps ajx | grep mybin;sleep 1;echo "#————————————————————————————————————————————————————#";done

    • 在fork函数被调用之前的代码被父进程执行
    • 父子进程代码共享(fork之后,父子进程回执行一样的代码),但是数据各自开辟空间,私有一份(采用写时拷贝)
    • 以父进程为模板,为子进程创建PCB

    (二)fork有两个返回值

    • fork成功的时候,会有两个不同的返回值,给子进程返回0,给父进程返回子进程的pid
    • fork失败的时候,则在父进程中返回 -1

    (三)用 if 进行分流

     

     

  • 相关阅读:
    STM32F1读取MLX90632非接触式红外温度传感器
    5、Python中的变量和表达式:变量的定义、赋值和数据类型转换
    QT day03
    目标检测 YOLOv5网络v6 0版本总结
    GB/T40024-2021工业电热设备节能监测方法
    手写文字识别易语言代码
    【数仓日常踩坑】记录一次特殊符号引发数据异常的排查思路
    Danswer 接入 Llama 2 模型 | 免费在 Google Colab 上托管 Llama 2 API
    【附源码】Python计算机毕业设计商店管理系统
    WebDAV之π-Disk派盘 + 纸间书摘
  • 原文地址:https://blog.csdn.net/m0_63783532/article/details/133217423