进程间通信(IPC)机制

编程

进程间通信" title="进程间通信">进程间通信(IPC)机制

读写磁盘文件中的信息是进程间通信的方法之一。可是,对许多程序来说,这种方法既慢又缺乏灵活性。因此,Linux提供了丰富的进程间通信(IPC)机制。

  • 信号(signal),用来表示事件的发生。
  • 管道(亦即shell用户所熟悉的“|”操作符)和FIFO,用于在进程间传递数据。
  • 套接字(socket),供同一台主机或是联网的不同主机上所运行的进程之间传递数据。
  • 文件锁定,为防止其他进程读取或更新文件内容,允许某进程对文件的部分区域加以锁定。
  • 消息队列,用于在进程间交换消息(数据包)。
  • 信号量(semaphore),用来同步进程动作。
  • 共享内存,允许两个及两个以上进程共享一块内存。当某进程改变了共享内存的内容时,其他所有进程会立即了解到这一变化。

信号

尽管将信号视为IPC的方法之一,但其在其他方面的广泛应用则更为普遍。

人们往往将信号称为“软件中断”。进程收到信号,就意味着某一事件或异常情况的发生。信号的类型很多,每一种分别标识不同的事件或情况。采用不同的整数来标识各种信号类型,并以SIGxxxx形式的符号名加以定义。

内核、其他进程(只要具有相应的权限)或进程自身均可向进程发送信号。

发生下列情况之一时,内核可向进程发送信号:

  • 用户键入中断字符(通常为Control-C)
  • 进程的子进程之一已经终止。
  • 由进程设定的定时器(告警时钟)已经到期。
  • 进程尝试访问无效的内存地址。
  • 在shell中,可使用kill命令向进程发送信号。在程序内部,系统调用kill()可提供相同功能。

收到信号时,进程会根据信号采取如下动作之一:

  • 忽略信号。
  • 被信号“杀死”
  • 先挂起,之后再被专门信号唤醒。

就大多数信号类型而言,程序可选择不采取默认的信号动作,而是忽略信号(当信号的默认处理行为并非忽略此信号时,会派上用场)或建立自己的信号处理器。信号处理器是由程序员定义的函数,会在进程收到信号时自动调用,根据信号的产生条件执行相应动作。

信号从产生直至送达至进程期间,一直处于挂起状态。通常,系统会在接收进程下次调度时,将处于挂起状态的信号同时送达。如果接收进程正在运行,则会立即将信号送达。然而,程序可以将信号纳入所谓“信号屏蔽”以求阻塞该信号。如果产生的信号处于“信号屏蔽”之列,那么此信号将一直保持挂起状态,直至解除对该信号的组设。

以上是 进程间通信(IPC)机制 的全部内容, 来源链接: utcz.com/z/511586.html

回到顶部