当前位置:   article > 正文

Linux fork和getpid语句详解_结合fork的执行流分析getpid的执行流

结合fork的执行流分析getpid的执行流
进程的定义
定义
应用程序关于某数据集合上的一次运行活动
操作系统进行资源分配和调度的基本单位

进程是程序的一次执行过程
进程是动态的,程序是静态的
同一程序同时运行于若干个数据集合上,该程序将对应与若干个不同的进程

每个进程拥有独立的地址空间
地址空间包括代码段、数据段和堆栈段
代码段,存储程序的代码
数据段,存储程序的全局变量和动态分配的内存
堆栈段,存储函数运行时的局部变量
进程之间的地址空间是隔离的
一个进程崩溃不会影响另一个进程
一个进程崩溃不会影响到操作系统
 
进程的属性
进程控制块
操作系统使用一个结构体记录进程的各类属性,该结构体被称为进程控制块

进程标识
进程id,每个进程的id都是唯一的
父进程id

地址空间
代码段的起始地址和长度
数据段的起始地址和长度
堆栈段的起始地址和长度

打开文件列表
打开文件时,在打开文件列表中记录被打开文件的信息
关闭文件时,在打开文件列表中删除被关闭文件的信息
进程终止时,操作系统遍历打开文件列表,将尚未关闭的文件关闭
getpid原型
原型
  1. #include <sys/types.h>
  2. #include <unistd.h>
  3. pid_t getpid(void);
  4. pid_t getppid(void);

功能描述
getpid获取当前进程ID
getppid获取父进程ID
pid_t是C语言中用户自定义类型
在sys/types.h中定义
typedef int pid_t;
getpid例子
程序
  1. #include <sys/types.h>
  2. #include <unistd.h>
  3. #include <stdio.h>
  4. int main()
  5. {
  6. printf("pid = %x, ppid = %x\n", getpid(), getppid());
  7. return 0;
  8. }
运行结果
pid = 4761, ppid = 2570
fork原型
原型
  1. #include <unistd.h>
  2. pid_t fork(void);

功能
创建一个子进程,父子进程并发运行
子进程复制父进程的如下属性
代码段、数据段的内容,父子进程拥有相同的代码和数据
打开文件列表
不复制进程的PID属性

返回值
父进程从fork返回处继续执行,在父进程中,fork返回子进程PID
子进程从fork返回处开始执行,在子进程中,fork返回0
fork例子1
程序
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. int main()
  4. {
  5. int pid;
  6. pid = fork();
  7. if (pid == 0)
  8. puts("child");
  9. else
  10. puts("parent");
  11. return 0;
  12. }
运行结果
  1. parent
  2. child
fork例子1讲解
if语句的两条分支都被执行了
then分支执行puts("child")
else分支执行puts("parent")

这是由父子进程并发运行导致的
子进程执行if语句的then分支
父进程执行if语句的else分支
fork例子2
程序
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. int main()
  4. {
  5. int pid;
  6. pid = fork();
  7. if (pid == 0)
  8. printf("child: my = %d, parent = %d\n", getpid(), getppid());
  9. else
  10. printf("parent: my = %d, child = %d\n", getpid(), pid);
  11. return 0;
  12. }
运行结果
  1. parent: my = 6988, child = 6989
  2. child: my = 6989, parent = 6988
fork例子2讲解
PID信息
父进程的PID为6988
子进程的PID为6989

子进程执行if语句的then分支
getpid()返回子进程PID——6989
getppid()返回父进程PID——6988
因此输出,child: my = 6989, parent = 6988

父进程执行if语句的else分支
getppid()返回父进程PID——6988
pid为子进程PID——6989
因此输出,parent: my = 6988, child = 6989
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/210188
推荐阅读
相关标签
  

闽ICP备14008679号