进程的认识

1.程序与进程之间的区别

程序就是没跑起来的进程 打开程序后,系统会生成一个进程
例如windows的桌面快捷方式就是一个程序 ,点击运行会生成一个进程
进程是程序的一次运行活动
通俗点的意思就是程序跑起来了,系统中多了一个进程

2.如何查看进程

在liunx下面使用 ps 指令进行查看
完整的是 ps -aux
但是显示的太多,需要筛查 配合grep来查找系统中的进程

ps-aux|grep init    直接筛选出来init的进程

或者使用top指令 类似windows的任务管理器

3.进程标识符 pid

每个进程都有一个唯一的非负整数表示唯一ID
叫做pid,类似与我们的身份证
pid=0;成为交换进程,表示进程调度
pid=1;表示init进程 作用系统的初始化

       pid_t pid;pid=getpid();printf("pid=%d",pid);

getpid获得当前进程pid号
getppid获得父进程pid号

4.父进程子进程

如果进程A创建了进程B
那么进程A是父进程
进程B是子进程
C程序储存空间是如何分配的
BSS段 非初始化数据段 存放的是未初始化的全局变量和静态变量。
栈区:由操作系统自动分配和释放 ,存放函数的参数值,局部变量的值等。每当一个函数被调用时,该函数的返回类型和一些调用的信息也会被存放到栈中。
栈中 保存的是自动变量就是指在函数内部定义使用的变量。只能在函数内部使用它。自动变量是局部变量,即它的作用区域是在定义它的函数内部。

正文,也就是代码段,在低地址处 【 代码段】

初始化了的数据在正文的上面的地址 【数据段】

没有初始化的地址在初始化地址的上面 【bss段 非初始化数据段】

malloc开辟出来的空间在堆那个地方 【 堆】

书写的函数,都是保存在栈里面
函数的地址保存在栈里面
每次函数调用所保存的信息都保存在这里 【 栈】

int(里面的参数) 命令行参数和环境变量

int a = 0; //全局初始化区
char *p1; //全局未初始化区
void main()
{int b; //栈 char s[] = “abc“;//栈 char *p2; //栈 char *p3 = “123456“; //123456\0在常量区,p3在栈上;体会与 char s[]="abc"; 的不同static int c =0; //全局初始化区 p2 = (char *)malloc(20); //堆区strcpy(p1, “123456“); //123456\0在常量区,编译器可能将它与p3指向的 “123456 “优化成一块

创建进程函数fork vfork

进程创建函数fork

pid_t pid1;
pid1=getpid();
printf("当前的pid号是%d\n",pid1);
fork(); //创建父子进程
if(pid1==getpid()){printf("这是父进程\n");
}else{printf("这是子进程,子进程的pid号是%d\n",getpid());
}

可以使用创建两个进程 进行比较

pid_t pid1;
pid_t pid2;
pid1=getpid();  //最开始使用getpid函数 获得最开始的pid
fork();  //使用fork创建
pid2=getpid();  //得到pid2 的pid号  判断是子进程还是父进程
if(pid1==pid2){printf("这是父进程\n");
}else{printf("这是子进程,子进程的pid号是%d\n",getpid());
}

需要注意!!
子进程创建成功后,fork是返回两个值,一个代表父进程,一个代表子进程:
返回值非负数,代表父进程
返回值为,代表子进程
调用失败返回 -1;
创建成功fork后 会创建出来子进程

pid_t pid1;
pid_t retpid;
pid=getpid();
retpid=fork();
if(retpid>0){printf("创建出来了父进程 pid号是 %d retpid是%d\n",getpid(),retpid);
}else{printf("创建了子进程  pid号是 %d  retpid是 %d\n",getpid(),retpid);
}

执行结果
创建出来了父进程 pid号是 28427 retpid是28428
创建了子进程 pid号是 28428 retpid是 0

通过运行结果可以看出 父进程的pid是28427 通过父进程创建出来子进程的pid号
子进程的pid号是父进程创建出来的 并且子进程的fork的返回值为0

进程创建fork

使用的是把所有的文件都从父进程拷贝到子进程

而新的是如果子进程不改变a的大小 他们两个进行a的共享
只有子进程对a动手脚的时候才会采用在子进程的内存空间里面备份一个a

1.创建子进程的目的

2.创建一个简单的服务器进程 使用子进程进行对接

在linux里面while使用printf要加入换行符才能显示出来

pid_t pid;
int data;
while(1){printf("请输入来的人的序号\n");scanf("%d",&data);if(data==1){pid=fork();if(pid==0){while(1){printf(" %d \n ",getpid());  //没有加入换行符显示不出来sleep(2);}}}else{printf("wait !!!!\n");
}
}return 0;
}

执行的结果

this is child getpid=12684//新创建的
this is child getpid=12682//第一次创建的
this is child getpid=12684
1
please data
this is child getpid=12685//新创建的
this is child getpid=12682//第二次创建的
this is child getpid=12684//第一次创建的

3.总结fork

fork进程会返回两个返回值,父进程的返回值是子进程的pid号 子进程的返回值是0

vfork函数

vfork 直接使用父进程的内存空间 (需要使用exit正常退出的时候 父进程才会使用到子进程使用的父进程的空间)影响的只是那个让他正常退出的值
vfork 函数创建进程会让子进程先执行,子进程执行完成后调用exit退出后,父进程才执行。

        pid_t pid;int data=0;int i=3;pid=vfork();if(pid==0){while(1){  data++;i=4;  //在这里使用给i定义  不能加int  printf("这是子进程 pid= %d data =%d\n",getpid(),data);sleep(2);if(data==3){  //打印出来会影响data的值exit(1);}}}else{while(1){printf("这是父进程 pid= %d data=%d\n",pid,data);printf("i=%d\n",i);  sleep(1);}}

输出的结果 i=4 data =3 子进程改变的值影响了子进程的值。

进程相关概念 读取当前进程getpid 读取父进程id getppid相关推荐

  1. Python Process类开启多层级进程杀不死问题解决(从父进程杀死子进程)

    Python Process类开启多层级进程杀不死问题 问题描述 问题分析 解决方案 问题描述 在使用python multiprocess包下的Process打开子进程,并在打开的子进程中再打开一个 ...

  2. 子进程及时知道父进程已经退出的最简单方案

    [精彩] 子进程及时知道父进程已经退出的最简单方案? http://www.chinaunix.net 作者:yuonunix  发表于:2003-10-31 10:14:14 [发表评论] [查看原 ...

  3. 关于进程(PCB | 父进程 | 子进程 | fork深层探讨 |僵尸进程与孤儿进程)

    文章目录 一.进程与PCB 1. 进程的概念: 2. 什么是PCB task_struct task_ struct内容分类 4. 查看进程 5. 进程概念的加深 二.父进程与子进程 1. 通过系统调 ...

  4. 进程相关概念、C程序的空间分配

    进程的定义: "进程"是操作系统的最基本.最重要的概念之一.但迄今为止对这一概念还没有一个确切的统一的描述.下面给出几种对进程的定义描述. 进程是程序的一次执行.进程是可以并行执行 ...

  5. Linux进程全解7——父进程wait / waitip回收子进程

    以下内容源于朱有鹏<物联网大讲堂>的课程学习整理,如有侵权,请告知删除. 一.wait介绍 1.wait的工作原理 (1)子进程结束时,系统向其父进程发送SIGCHILD信号: (2)父进 ...

  6. 问题:子进程父进程哪个先执行:【转】关于 fork 和父子进程的理解

    2019独角兽企业重金招聘Python工程师标准>>> 关于 fork 和父子进程的理解   (http://blog.163.com/kingore@126/blog/static ...

  7. 进程控制 父进程子进程 fork pid

    进程:正在运行的程序(分配资源:内存,CPU,IO等) 程序:有限指令的集合(静态:没有执行,存放在外存) 并发:多个任务"同时"执行. (处理器某一时刻最多只运行一个进程) 1. ...

  8. Linux 的父进程和子进程的执行情况(附有案例代码)

    系列文章目录 该文章主要是针对面试做大致的了解,通俗易懂!!! 一.父进程.子进程的定义 1.父进程 指已创建一个或多个子进程的进程.在Linux里,除了进程0以外的所有进程都是由其他进程使用系统调用 ...

  9. 父进程回收子进程之wait()函数使用解读

    1.wait的工作原理 (1)子进程结束时,系统向其父进程发送SIGCHILD信号 (2)父进程调用wait函数后阻塞 (3)父进程被SIGCHILD信号唤醒,然后去回收僵尸子进程 (4)父子进程之间 ...

最新文章

  1. docker build 指定dockerfile
  2. 【MATLAB】矩阵操作 ( 矩阵下标 | 矩阵下标排列规则 )
  3. 计算机应用基础2004年,计算机应用基础2004年下半年全国试题参考答案2
  4. python简单网络爬虫_【Python】简单的网络爬虫
  5. Educational Codeforces Round 72 (Rated for Div. 2)
  6. python 利用抛出异常并处理的优点
  7. ServletRequest startAsync()的有用性有限
  8. Anaconda3+PyTorch安装教程
  9. python2.7安装pygame_python 安装 pygame了
  10. 哪些因素影响大数据的发展
  11. Property “pageNumber“ was accessed during render but is not defined on instance.
  12. 阿里笔试题:求两个子序列的最大连续子序列
  13. Windows10桌面美化——打造简洁高效美观桌面
  14. 常见的集合的面试题总结
  15. Docker 挂载Volume数据卷
  16. BeanUtils.copyProperties 和 fastjson 性能对比
  17. 从代码和底层探究Synchronized锁实现
  18. 【微信小程序】wx.request请求后success回调的数据无法显示到页面上
  19. 还在用generator生成xxx管理系统的CRUD代码?来看看我是怎么写的
  20. 矩阵的QR分解以及在最小二乘法中的应用

热门文章

  1. BigDecimal.setScale()方法总结
  2. 马化腾:差点收购YouTube
  3. Unity最全渲染优化(LOD、遮挡剔除、光照贴图、Mash合并)
  4. ImmunoChemistry丨ICT艾美捷MicroTiter平板设计说明书
  5. 谈《美丽人生》,什么样的人生最美丽?
  6. 利用更新后的tushare.pro数据库免费获得股票的基本信息
  7. 群晖设置存储空间和共享文件夹
  8. 怎么把动图放到word里_WORD中如何插入动态图片
  9. 第一章 :Django安装与配置虚拟环境
  10. mouseover和mouseenter、mouseout和mouseleave