该文章内容并非原创,labuladong文章笔记。仅用于个人学习,侵删。
对于Linux操作系统来说,进程就是一个数据结构,该数据结构就是linux对于一个数据的描述,部分源码:
struct task_struct {
// 进程状态
long state;
// 虚拟内存结构体
struct mm_struct *mm;
// 进程号
pid_t pid;
// 指向父进程的指针
struct task_struct __rcu *parent;
// 子进程列表
struct list_head children;
// 存放文件系统信息的指针
struct fs_struct *fs;
// 一个数组,包含该进程打开的文件指针
struct files_struct *files;
};
文件描述符
在进程数据结构中,有一个files数组,该数组包含进程打开的文件指针,一般来说:
- files[0] :程序读取输入
- files[1] :程序输出
- files[2] :程序输出错误
每个进程被创建时,这三个位置被填入默认值,分别是标准输入流、标准输出流、标准错误流,常说的「文件描述符」说的就是该文件指针
而所谓的重定向就是改变文件指针数组,使其指向其他地方
管道符就是将一个文件的输出和另一个文件的输入连接起来
Linux中线程与进程
在linux中线程和进程基本没有区别,linux都是用 task_struct 来描述它们,唯一的区别就是共享数据的区域不同
进程与其子进程中mm结构与files结构不共享
![
而进程与其子线程中共享同一个内存和files数组