linux系统进程创建过程详解
来源:互联网 发布:node服务器和appache 编辑:程序博客网 时间:2024/05/22 17:51
Linux系统进程复习总结 1. 什么是进程? (what?)
进程就是内核对某个运行状态的数据集合的一种总结, 是进行系统资源分配和调度的基本单元
2. linux内核如何创建进程?(from?)
Linux内核在创建进程时的函数调用主要是通过上面三个函数执行的, 其中copy_process函数最为有趣! 那我们就深入简出的研究研究这个函数看看它都做了什么???
Copy_process:这个函数主要功能是对 task_struct 结构体进行拷贝从重新赋值, 在
p = dup_task_struct(current);
中对thread_info 进行初始化, 而 thread_info 在linux 内核2.6以后加入的一个新的结构体, 这个结构体内部存在一个指针指向 PCB(task_struct结构体),
ftrace_graph_init_task(p);
task结构中ftrace_ret_stack结构变量的初始化,即函数返回用的栈
rt_mutex_init_task(p);
是对task中的互斥量进程初始化
init_sigpending(&p->pending);
初始化未决信号
sched_fork(struct task_struct *p, int clone_flags)
初始化进程状态为 TASK_RUNNING 状态
由于比较懒就写这么多了, linux源码分析我分析的不是很准哦!只做参考 总结下来 copy_process 主要还是对 Task_struct 结构体的初始化
而 do_fork 的主要功能是加入运行队列中, 让cpu 有机会调用这个新的进程
大概就这些了, 毕竟能力有限, 我不是研究linux内核源码的料(还有个copy_thread 函数没研究, 偷偷懒 ^-^), 仅仅只是通过查看linux内核大致了解下linux内核中进程的创建过程
那么好, linux内核如何创建一个新的进程的过程大致的了解了下现在开始看 man , 查查 fork
函数名: fork
参数: 无
返回值: pid_t
函数功能: 创建一个子进程
特点: 一次调用两次返回 首先确定这个函数是一个系统调用函数, 通过系统调用产生软中断, 陷入内核中, 由内核创建了一个新的进程, 后将子进程的把柄(句柄), linux称它为进程 pid 返回给父进程(把把柄给父进程, 让父进程管理子进程), 而子进程拿不到父进程的把柄, 所以返回 0 , 如果创建错误的话, 看上面的返回值英文注释去, 好了介绍就到这里了, 附上简单的代码结束
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
// 1.perror 这个是显示错误码的 在shell 中使用 perror 100 显示错误码
//
// 2. fork 特点
// 一次调用两次返回
// fork 是一个系统调用在Linux内核中完成
// 是在每一个进程各自的进程空间中返回
//
// 为什么父进程和子进程的返回值不一样
// 父子的关系是一对N的关系, 老爹找儿子的pid比较难
//
// fork 理解角度: 就是两个进程同时往下运行
//
// 为什么子函数选择从fork 之后运行 , 而不是 main 函数开始运行呢?
// 这个和fork函数的机制有关
// 写时复制, 子进程要拷贝父进程的代码段 数据段 堆栈段 PCB进程控制块
// PCB进程控制块就是linux内核管理进程的数据结构 task_struct
// 因为孩子拷贝了父进程的运行场景, 所以child就没有必要再看一遍了
// 这个时候资源已经复制了, 没要在重新开始运行
int main(void)
{
pid_t pid;
printf("before fork pid = %d\n", getpid());
pid = fork();
if (pid == -1)
{
perror("fork err");
return -1;
}
else if (pid == 0)
{
printf("child: %d\n", getpid());
}
else if (pid > 0)
{
printf("parent: %d\n", getpid());
}
printf("after fork\n");
return 0;
}
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
// 1.perror 这个是显示错误码的 在shell 中使用 perror 100 显示错误码
//
// 2. fork 特点
// 一次调用两次返回
// fork 是一个系统调用在Linux内核中完成
// 是在每一个进程各自的进程空间中返回
//
// 为什么父进程和子进程的返回值不一样
// 父子的关系是一对N的关系, 老爹找儿子的pid比较难
//
// fork 理解角度: 就是两个进程同时往下运行
//
// 为什么子函数选择从fork 之后运行 , 而不是 main 函数开始运行呢?
// 这个和fork函数的机制有关
// 写时复制, 子进程要拷贝父进程的代码段 数据段 堆栈段 PCB进程控制块
// PCB进程控制块就是linux内核管理进程的数据结构 task_struct
// 因为孩子拷贝了父进程的运行场景, 所以child就没有必要再看一遍了
// 这个时候资源已经复制了, 没要在重新开始运行
int main(void)
{
pid_t pid;
printf("before fork pid = %d\n", getpid());
pid = fork();
if (pid == -1)
{
perror("fork err");
return -1;
}
else if (pid == 0)
{
printf("child: %d\n", getpid());
}
else if (pid > 0)
{
printf("parent: %d\n", getpid());
}
printf("after fork\n");
return 0;
}
阅读全文
0 0
- linux系统进程创建过程详解
- Linux系统创建进程过程简单分析
- 进程创建过程详解 CreateProcess
- Linux下进程的创建过程分析(_do_fork/do_fork详解)--Linux进程的管理与调度
- linux系统编程之进程(八):守护进程详解及创建,daemon()使用
- linux系统编程之进程(八):守护进程详解及创建,daemon()使用
- linux系统编程之进程(八):守护进程详解及创建,daemon()使用
- linux系统编程之进程(八):守护进程详解及创建,daemon()使用
- linux系统编程之进程(八):守护进程详解及创建,daemon()使用
- linux系统编程之进程(八):守护进程详解及创建,daemon()使用
- linux系统编程之进程(八):守护进程详解及创建,daemon()使用
- linux系统编程之进程(八):守护进程详解及创建,daemon()使用
- linux C 进程 创建进程 详解
- Linux下进程的创建过程分析(_do_fork/do_fork详解)--Linux进程的管理与调度(八)
- Linux进程的管理与调度(八) -- Linux下进程的创建过程分析(_do_fork/do_fork详解)
- 伪代码说明Linux进程创建过程
- Linux下守护进程的创建过程
- 伪代码说明Linux进程创建过程
- Mysql开启对外访问
- python3抓包百度图片并下载
- 使用回调函数实现一个通用的冒泡排序,可以排序不同的数据类型。
- faster rcnn cudnn版本不兼容问题
- Page的ResolveClientUrl与ResolveUrl读取路径
- linux系统进程创建过程详解
- 数据结构与算法书中,字谜游戏java实现
- Subarray GCD
- android ViewPager三种适配器
- bootstrap表格和按钮样式
- hibernate的基本配置--第二天
- mybatis 详解
- 7:渐变(背景-属性)-1.1.3线性渐变
- 手写识别项目(7.15)