随笔 - 40, 文章 - 0, 评论 - 9, 引用 - 0
数据加载中……

进程间通讯简介

http://bbs.chinaunix.net/viewthread.php?tid=1130381

 所谓进程间通讯,顾名思义,就是在2个(多数情况下)或多个进程间传递信息。方法大致如下几种:
     1,  文件(file),匿名管道(anonymous pipe),命名管道(named pipe),信号(signal).
         2、  System V IPC 包括消息队列(message queue),共享内存(shared memory),信号量(semaphore)。这种形式的ipc首先在UNIX分支system V中使用,现在多数unix系统都支持。
文件形式的IPC:

进程(process) A写信息到文件1,进程B读文件1。文件的内容,由进程自己决定。
匿名管道:

command1 args1 | command2 args2. 最常见的例子:ls –l |more 由于管道操作由shell代替完成,没有产生有名字的实体,所以称为匿名管道。 Shell做的事情是调用pipe(),产生一个管道,然后把command1的输出连接到管道的出入端,把command2的输入连接到管道的输出端。
命名管道

首先,建立一个特殊文件,mkfifo pipe1或者mknod fifo1 p
然后,就当作正常文件读写pipe1。例如: ls > fifo1 (写入)。
while read a
do
   echo $a
done    (读出)
由于产生有名字的实体,所以被称为命名管道。
信号:

简单的用法: kill –USER2 pid,也就是通过kill()系统调用或者kill命令,发送信号到别的进程。各个进程对于信号的处理过程是自己定义的(除了9,也就是KILL是强制 的)。比如自己可以忽略HUP,TERM,INT(按control-C), 等。
消息队列(message queue)

消息队列,是一个队列的结构,队列里面的内容由用户进程自己定义。实际上,队列里面记录的是指向用户自定义结构的指针和结构的大小。要使用message queue,首先要通过系统调用(msgget)产生一个队列,然后,进程可以用msgsnd发送消息到这个队列,消息就是如上所说的结构。别的进程用 msgrcv读取。消息队列一旦产生,除非明确的删除(某个有权限的进程或者用ipcrm命令)或者系统重启。否则,产生的队列会一直保留在系统中。而 且,只要有权限,就可以对队列进行操作。消息队列和管道很相似,实际上,管道就是用户消息为1个字节的队列。
ipcs –aq命令可以查看message queue的状况:
Message Queues:
T      ID        KEY    MODE         OWNER    GROUP  CREATOR   CGROUP CBYTES  QNUM QBYTES  LSPID  LRPID  STIME    RTIME    CTIME
q     256 0x417d0896 --rw-------      root   daemon     root   daemon      0     0  16384  97737 210466 14:31:14 14:31:14  9:52:53
其中:
T: 类型, q 表明这是个消息队列
ID: 用户自己定义的,在调用msgget时传送的参数。
Key: 系统返还的全局唯一的ID。
Mode: 权限,含义和文件权限基本一致
Owner, group: 队列建立者的名字和组
CREATOR, CGROUP:队列建立者和组的ID
CBYTES : 目前queue在队列里的字节数
QNUM, 目前queue在队列里的消息数
QBYTES: 队列中消息最大允许字节数
LSPID: 最后发送者PID
LRPID: 最后接受者PID
STIME: 最后发送时间
RTIME: 最后接受时间。.
CTIME: 建立或者最后修改的时间
共享内存(shared memory)

共享内存是一段可以被多个进程共享的内存段。首先,用shmget系统调用产生指定大小的共享内存段,然后需要访问此共享内存的进程调用shmat系统调 用,把这个内存段附加到自己的地址空间,然后就可以像访问自己私有的内存一样访问这个内存段了。等到访问完毕,用shmdt脱离。同message queue一样,共享内存一旦产生,除非明确的删除(某个有权限的进程或者用ipcrm命令)或者系统重启。否则,产生的共享内存会一直保留在系统中。而 且,只要有权限,就可以对共享内存进行操作。共享内存的内容由进程自己定义。为了防止多个进程在同一时间写同样一段共享内存,一般程序会使用信号量来控制 对某一段地址的读写。
ipcs –am命令可以查看share memory的状况:
Shared Memory:
T      ID        KEY    MODE         OWNER    GROUP  CREATOR   CGROUP NATTCH                SEGSZ   CPID   LPID   ATIME    DTIME    CTIME
m     258          0 --rw-r-----    oracle      dba   oracle      dba     12              8388608 106303 106329 16:28:54 16:48:36 16:28:49
T: 类型 m 表明这是个共享内存
ID: 用户自己定义的,在调用shmget时传送的参数。
Key: 系统返还的全局唯一的ID。
Mode: 权限,含义和文件权限基本一致
Owner, group: 队列建立者的名字和组
CREATOR, CGROUP:队列建立者和组的ID
NATTCH: 有几个进程挂接(attach)在这段共享内存上
SEGSZ: 共享内存段大小(字节)
CPID: 产生者PID
LPID: 最后挂接(attach)或者脱离(detach)者PID
ATIME: 最后挂接(attach)时间
DTIME: 最后脱离(detach)时间。.
CTIME: 建立或者最后修改的时间
信号量(semaphore)

在操作系统中,有些资源数量是有限的,在同一时间,只能由有限(一个或几个)的进程使用和访问。例如磁带机,同一时间,只能由一个进程使用。这样的资源被 称为关键(critical)资源。信号量就是用来记录关键资源的使用情况的。首先,利用系统调用semget产生一个信号量。当需要使用关键资源时,调 用semop,传递的参数为需要使用的资源的数量,例如2个,参数就为+2。如果这个资源有2个或者更多可用,进程就获得了使用权,否则就必须等待,直到 有足够的资源可用。当进程使用资源结束的时候,也用semop释放关键资源。参数为需要释放的数量,例如2,参数为-2。同message queue一样,共信号量一旦产生,除非明确的删除(某个有权限的进程或者用ipcrm命令)或者系统重启。否则,信号量会一直保留在系统中。而且,只要 有权限,就可以对其进行操作。
ipcs –as命令可以查看Semaphore的状况:
Semaphores:
T      ID        KEY    MODE         OWNER    GROUP  CREATOR   CGROUP NSEMS   OTIME    CTIME
s       0 0x696e6974 --ra-r--r--      root   system     root   system     8  9:52:53  9:59:30
T: 类型 s 表明这是个信号量
ID: 用户自己定义的,在调用semget时传送的参数。
Key: 系统返还的全局唯一的ID。
Mode: 权限,含义和文件权限基本一致
Owner, group: 队列建立者的名字和组
CREATOR, CGROUP:队列建立者和组的ID
NSEMS: 本信号量上信号的数量。
OTIME: 最后一次操作(semop)的时间
CTIM: 建立或者最后修改的时间


posted on 2008-10-09 11:20 阅读(706) 评论(0)  编辑 收藏 引用 所属分类: liunx编程技术


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理