(14)fork函数

fork函数:

pid_t fork(void) 

创建子进程。父子进程各自返回。父进程返回子进程pid。 子进程返回 0.

getpid();getppid(); >0 父进程 =0 子进程

循环创建N个子进程模型。 每个子进程标识自己的身份。

父子进程相同:

fork后。 data段、text段、堆、栈、环境变量、全局变量、宿主目录位置、进程工作目录位置、信号处理方式

父子进程不同:

进程id、返回值、各自的父进程、进程创建时间、闹钟、未决信号集

父子进程共享:

读时共享、写时复制。———————— 全局变量。

  1. 文件描述符

2. mmap映射区。

    每个进程在内核之中都有一个进程控制块(PCB)来维护进程的相关信息,Linux内核的进程控制块是task_struct结构体。

PCB进程控制块: 进程id,系统中每个进程都有唯一的id,C语言中使用pid_t类型表示,其实就是一个非负整数。进程的状态,有就绪,运行,挂起,停止等状态。进程切换的时候需要保存和恢复一些进程的信息。文件描述符表,包含很多指向file结构体的指针,和信号相关的信息,用户id和组id

ps -aux :当前进程的id.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
int main(int argc, char *argv[])
{
    int i;
    pid_t pid;
    for (i = 0; i < 5; i++) {       
        if (fork() == 0)        // 循环期间, 子进程不 fork
            break;
    }
    if (5 == i) {       // 父进程, 从 表达式 2 跳出
        sleep(5);
        printf("I'm parent 
");
    } else {            // 子进程, 从 break 跳出
        sleep(i);
        printf("I'm %dth child
", i+1);
    }
    return 0;
}

gdb调试:
	设置父进程调试路径:set follow-fork-mode parent (默认)
	设置子进程调试路径:set follow-fork-mode child

  

原文地址:https://www.cnblogs.com/love-life-insist/p/14110740.html