[TOC] > [微信文章](https://mp.weixin.qq.com/s/USb5e2Zoc0LRgRShRpTYfg?utm_source=tuicool&utm_medium=referral) ## 概述 进程与线程都是类似的结构 ``` struct task_struct { // 进程状态 long state; // 虚拟内存结构体 struct mm_struct *mm; // 进程号 pid_t pid; // 指向父进程的指针 struct task_struct *parent; // 子进程列表 struct list_head children; // 存放文件系统信息的指针 struct fs_struct *fs; // 一个数组,包含该进程打开的文件指针 struct files_struct *files; }; ``` ### 进程与线程的区别 * 我们知道系统调用`fork()`可以新建一个子进程,函数`pthread()`可以新建一个线程。 但无论线程还是进程,都是用task_struct结构表示的,唯一的区别就是**共享的数据区域不同** * 其他操作系统 线程与进程是不一样的 ![UTOOLS1579503155061.png](http://yanxuan.nosdn.127.net/98ed72b3495c4416dec210c8b221a96f.png) :-: 父进程与子进程 ![UTOOLS1579503161742.png](http://yanxuan.nosdn.127.net/4665e368035332093e29c9fb4dc6c93a.png) :-: 父进程与子线程 ## 文件表述符 每个进程被创建时,files的前三位被填入默认值,分别指向标准输入流、标准输出流、标准错误流。我们常说的「文件描述符」就是指这个文件指针数组的索引,所以程序的文件描述符默认情况下 0 是输入,1 是输出,2 是错误 ### 管道符 管道符其实也是异曲同工,把一个进程的输出流和另一个进程的输入流接起一条「管道」,数据就在其中传递