linux 进程间通信总结
不同 | 的 | 进程 | ||||
方法 | 描述 | 特点 | P/C | Sib | Unrel | 不同的线程 |
fork-execv-rgv exit-wait 方法 | 使用一组参数来调用某个程序,被调用函数将一个整型值返回给其他调用者。父进程通过fork来创建一个新的进程。在次新的进程中的程序可以通过调用execv来运行新的程序,并传给新程序一组参数。子进程通过使用exit传回一个返回值,同时父进程通过wait来接受这个值。 | M(发送消息) | * | |||
environ | 系统调用通过一个叫做environ的系统全局变量自动将一组字符串复制进新的程序中。此方法运行进程传值给子进程。由于整个环境被赋值给子进程,子进程无法改变符进程的运行环境。 | M 面向对象 单向传输 用于相关进之间 单机使用 | ||||
pipe | 由进程创建的单向数据流。包含连接到内核上的文件描述符。写进一个文件描述符的数据可以从另一个文件描述符读出来。如果进程在调用管道之后调用了fork,那么新的进程就可以通过同样的管道读写数据。 | S(面向流的) 单向传输 用于相关进程 单机使用 | * | * | *适当的使用 | |
kill-signal | 信号是一条从一个进程发往另一个进程的整型消息(使用kill)。接受进程可以通过使用signal来安排一个处理函数,此函数在信号到来时背调用。 | M 某一时刻单向的 进程必须拥有相 同的用户ID 单机使用 | * | * | * | * |
inet socket | 是这样一条连接,他的两个端点通过特定的端口号建立起来。字节流通过socket进行传输,从一个进程到达另一个进程。有两种主要的实现方式: 流socket和数据报socket。这两者皆可以双向传输。 流socket类似于文件描述符:使用write和read调用来发送和接受数据。 数据报socket类似于明信片:写者将缓存中的一块数据发给读者。所有的交互都以数据缓存的形式完成,而不是数据流。 | M S 两者都有 双向传输 可以再无关进程 中使用 可以通过网络传输 | ? | ? | ? | ?不适当的使用 |
Unix socket | ||||||
named pipe (FIFO) | 工作方式类似于一个常规管道,但是可以连接两个无关进程。命名管道由文件名来标识。写者使用open来打开文件并写数据,读者同样使用open打开读数据。 | S 单向传输 可以连接无关进程 单机使用 | ? | ? | * | ? |
Shared Memory | 每个进程都有其自己的数据空间。程序所定义的任何变量或运行时刻分配的空间都只有对该进程是可见的。进程可以使用shmget和shmat来创建可以被多个进程共享的内存段。由一个进程写入共享内存段的数据可以被别的对此内存段有访问权限的进程读出。这是IPC中最有效的一种方法,因为所有的通信并不需要数据的传输。 | 面向随机访问 多个无关进程可以同时交互 单机使用 | * | * | * | ? |
Messages Queues | 工作原理类似于FIFO,但他并不是一文件名来标识。进程可以将信息加到队列中,然后由其他进程将数据从队列中取出。多个队列可以被多个进程共享。 | M 单向传输 单机使用 | * | * | * | * |
Semaphores | 信号量是系统级的变量,程序之间可以通过信号量来进行通信。进程可以对信号量做加1减1操作或等待信号量到某个特定的值。 | M 多个无关进程可以同时交互 单机使用 | * | * | * | ? |
Files | 文件可以被多个进程同时打开。如果某进程将数据写入一个文件,另外的进程可以将该文件中的数据读出。很多复杂的同学都可以通过古老的文件机制来实现。 | 面向随机访问 多个无关进程可以同时交互 网络文件系统可以支持跨机器的多进程通信 | * | * | * | ? |
File Locks | 进程可以对文件的某一段加锁,使自己可以单独的对这一段进行改动。另一个试图锁住此文件的进程将被挂起,直到这个文件被解锁。文件所机制允许进程间通信,让所有的进程都知道是哪一个进程在读取或修改文件。 | M 多个无关进程可以同时交互 单机使用 | * | * | * | ? |
mutexes | C 用来任务同步或合作 | * | ||||
link | C | * | * | * | ? | |
variables | M | * | ||||