【linux】进程|查看进程|PID值|fork原理

本文详细介绍了进程的基本概念,如何通过系统调用获取进程标识符,以及父进程为何通常是bash。重点讲解了fork原理,包括其返回值、代码和数据共享,以及如何创建并控制子进程。最后讨论了代码和数据独立性在fork中的实现方式。
摘要由CSDN通过智能技术生成

1. 什么是进程

进程是内核关于进程的相关数据结构+当前进程的代码和数据

2.查看进程

ls /proc,proc 为process的简称,保存进程相关属性的目录

3.通过系统调用获取进程标识符

1.获取PID值

getpid 需要头文件 <sys/types.h> 和<unistd.h>,返回值为 getpid_t类型,表示当前进程的PID值

#include<stdio.h>
  2 #include<sys/types.h>
  3 #include<unistd.h>
  4 int main()
  5 {
  6   while(1)
  7   {
  8     printf("我已经是一个进程了,PID为:%d\n",getpid());                                                                                                              
  9     sleep(1);                                                                                                                        
 10   }                                                                                                                                  
 11   return 0;                                                                                                                          
 12 }      

2. 获取父进程PID值

getppid 头文件与getpid相同,返回值为父进程的PID值

 1 #include<stdio.h>
  2 #include<sys/types.h>
  3 #include<unistd.h>
  4 int main()
  5 {
  6   while(1)
  7   {
  8     printf("我已经是一个进程了,PID为:%d,我的父进程PID为:%d\n",getpid(),getppid());                                                                                 
  9     sleep(1);                                                                                                                                                    
 10   }                                                                                                                                                              
 11   return 0;                                                                                                                                                      
 12 }  

父进程PID 为 -bash

bash为命令行解释器,本质上也是一个进程
命令行启动的所有程序,最终都会变成进程,而该进程对应的父进程都是bash

3.为什么父进程都是bash?

bash怕你写的代码有问题,所以使用bash创建的子进程完成任务,这样就算是挂了,bash也没事

4.指定进程暂停

在终端1中运行./pro,在终端2中输入 kill - 9+自己进程的PID

5.如何创建子进程

创建子进程—— fork(),头文件为<unistd.h> ,返回值是 pid_t类型

1. fork返回值

父进程返回子进程的PID值,子进程返回0,失败返回-1

2.使父子进程执行不同的任务

#include<stdio.h>
  2 #include<sys/types.h>
  3 #include<unistd.h>
  4 int main()
  5 {
  6  pid_t ret= fork();
  7  if(ret==0)
  8  {
  9    //子进程
 10    while(1)  
 11    {
 12    printf("我是子进程,我的pid是:%d,我的父进程是:%d\n",getpid(),getppid());
 13    sleep(1);
 14    }
 15     
 16  }
 17  else if(ret>0)
 18  {
 19    //父进程
 20    while(1)
 21    {
 22    printf("我是父进程,我的pid是:%d,我的父进程是:%d\n",getpid(),getppid());
 23    sleep(1);
 24    }                                                                                                                                                                 
 25  }
 26  else
 27  {   
 //报错
 29  }         
 30   return 0;
 }


3. 结论

fork之后,执行流会变成2个
fork之后,谁先运行由调度器决定
fork之后,fork之后的代码共享,通常通过if和else if来进行执行流分流

6. fork 原理

1.fork做了什么

子进程pcb的大部分属性会以父进程pcb为模板,把父进程大部分里面的数据拷给子进程
小部分属于子进程私有的,例如PID、PPID值
因为进程等于数据结构+代码和数据,所以父进程指向自己的代码和数据,子进程也会指向同样的代码和数据
创建子进程:创建独立的pcb结构,父子进程看到的是同一份代码和数据

2.fork 如何看待代码和数据

进程在运行的时候,是具有独立性的
当我们在执行代码同时运行父子进程时,若使用 kill- 9 干掉父进程后,子进程仍能运行
父子进程在运行时,也是具有独立性的

父子进程指向同一块代码和数据,独立性如何保证?
代码:
代码在内存区域是只读的(从来不会自己发生变化,不会有人修改)
父子进程两者都读,不会互相影响

3.fork如何理解两个返回值问题

当我们函数内部准备执行return的时候,我们的主体功能已经完成
fork本质上是操作系统提供的一个创建子进程的函数
所以当到return时,说明创建子进程已经完成了,return语句,父进程会执行一次,子进程执行一次,共执行两次

  • 26
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值