进程

父进程与子进程的共享
在克隆进程时,Linux 允许两个进程共享相同的资源,包括文件(file对象)、信号处理程序和虚拟内存等。当某个资源被共享时,该资源的引用计数值会增加 1,从而只有两个进程均终止时,内核才会释放这些资源。
而子进程被创建之后,复制了父进程的全局变量、静态变量、文件描述符等,所以堆,栈,全局区,都是独立的。
什么是文件描述符
在Linux中,进程是通过文件描述符(file descriptors,简称fd)而不是文件名来访问文件的,文件描述符实际上是一个整数。每个进程都有一个文件描述符表,表示这个进程打开的所有文件。文件描述表中每一项都是一个指针,指向一个用于描述打开的文件的数据块———file对象,file对象中描述了文件的打开模式,读写位置等重要信息,当进程打开一个文件时,内核就会创建一个新的file对象。需要注意的是,file对象不是专属于某个进程的,不同进程的文件描述符表中的指针可以指向相同的file对象,从而共享这个打开的文件。
管道通信与文件描述符
一般的管道,只能在父子进程间进行通信,这是因为管道实现的进程间通信是在父进程fork()出子进程时,子进程会继承父进程的文件描述符表,而这个文件 描述符表里记录了所有父进程打开的文件,所以子进程也继承了父进程打开的文件,所以父子进程可以通过同一个文件描述符去访问同一个文件,而管道就是建立在 文件描述符上的。建立一个管道必须和两个文件描述符相关,一个可以赋予可读权限,一个可以赋予可写权限,但是这两个文件描述符其实都和同一个文件关联,所以你通过不同的文件描述符去访问这个文件时,可以获得不同的访问权限,如果在父子进程中,在父进程将fd[0]为可读,fd[1]可写,而子进程fd[0]可读,fd[1]可写,那么这个管道就将父子进程连起来
进程与线程
每个进程至少拥有一个线程,来执行进程的地址空间中的代码,该线程称为主线程。
进程是资源分配的最小单位,线程是CPU调度的最小单位。
进程间的通信方式(IPC)
# 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在父子进程间使用。
# 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
# 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
# 消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
# 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
# 共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。shmget,shmat等方式见 http://blog.csdn.net/liuy5277/article/details/8393521
# 套接字( socket ) : 套接口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
原文地址:https://www.cnblogs.com/qionglouyuyu/p/4615423.html