天天看点

Linux fork和getpid语句详解

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

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

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

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

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

打开文件列表 打开文件时,在打开文件列表中记录被打开文件的信息 关闭文件时,在打开文件列表中删除被关闭文件的信息 进程终止时,操作系统遍历打开文件列表,将尚未关闭的文件关闭 getpid原型 原型

#include <sys/types.h>
#include <unistd.h>

pid_t getpid(void);
pid_t getppid(void);           

功能描述 getpid获取当前进程ID getppid获取父进程ID pid_t是C语言中用户自定义类型 在sys/types.h中定义 typedef int pid_t; getpid例子 程序

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

int main()
{
    printf("pid = %x, ppid = %x\n", getpid(), getppid());
    return 0;
}               

运行结果

pid = 4761, ppid = 2570
           

fork原型 原型

#include <unistd.h>

pid_t fork(void);               

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

返回值 父进程从fork返回处继续执行,在父进程中,fork返回子进程PID 子进程从fork返回处开始执行,在子进程中,fork返回0 fork例子1 程序

#include <stdio.h>
#include <unistd.h>

int main()
{
    int pid;
    pid = fork();
    if (pid == 0)
        puts("child");
    else
        puts("parent");
    return 0;
}               

运行结果

parent
child
           

fork例子1讲解 if语句的两条分支都被执行了 then分支执行puts("child") else分支执行puts("parent")

这是由父子进程并发运行导致的 子进程执行if语句的then分支 父进程执行if语句的else分支 fork例子2 程序

#include <stdio.h>
#include <unistd.h>

int main()
{
    int pid;
    pid = fork();
    if (pid == 0)
        printf("child: my = %d, parent = %d\n", getpid(), getppid());
    else
        printf("parent: my = %d, child = %d\n", getpid(), pid);
    return 0;
}               

运行结果

parent: my = 6988, child = 6989
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

继续阅读