进程间通信软帝信息科技_第1页
进程间通信软帝信息科技_第2页
进程间通信软帝信息科技_第3页
进程间通信软帝信息科技_第4页
进程间通信软帝信息科技_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

linux进程间通信信号共享内存消息队列软帝信息科技http

信号通信信号概述信号是

中断。信号(signal)机制是Unix系统中最为古老的进程之间的通信机制。它用于在一个或多个进程之间传递异步信号。很多条件可以产生一个信号。当用户按某些终端键时,产生信号。在终端上按DELETE键通常产生中断信号(SIGINT)。这是停止一个已失去控制程序的方法。硬件异常产生信号:除数为0、无效的

等等。这些条件通常由硬件检测到,并将其通知内核。然后内核为该条件发生时正在运行的进程产生适当的信号。例如,对执行一个无效

访问的进程产生一个SIGSEGV。软帝信息科技http

进程用kill(2)函数可将信号发送给另一个进程或进程组。自然,有些限制:接收信号进程和发送信号进程的所有者必须相同,或发送信号进程的所有者必须是超级用户。用户可用kill(

1

)命令将信号发送给其他进程。此程序是kill函数的界面。常用此命令终止一个失控的 进程。当检测到某种条件已经发生,并将其通知有关进程时也产生信号。这里并不是指硬件产生条件(如被0除),而是条件。例如SIGURG(在网络连接上传来非规定波特率的数据)、SIGPIPE(在管道的读进程已终止后一个进程写此管道),以及SIGALRM(进程所设置的闹钟时间已经超时)。软帝信息科技http

内核为进程生产信号,来响应不同的事件,这些事件就是信号源。主要的信号源如下:异常:进程运行过程中出现异常;其它进程:一个进程可以向另一个或一组进程发送信号;终端中断:Ctrl-C,Ctrl-\等;作业控制:前台、

进程的管理;分

:CPU超时或文件大小突破限制;通知:通知进程某事件发生,如I/O就绪等;:计时器到期。软帝信息科技http

Linux中的信号:1)

SIGHUP5)

SIGTRAP9)

SIGKILL13)

SIGPIPE17)

SIGCHLD21)

SIGTTIN25)

SIGXFSZ29)

SIGIO3)

SIGQUIT7)

SIGBUS11)

SIGSEGV4)

SIGILL8)

SIGFPE12)

SIGUSR22)

SIGINT6)

SIGABRT10)

SIGUSR114)

SIGALRM18)

SIGCONT22)

SIGTTOU15)

SIGTERM19)

SIGSTOP23)

SIGURG16)

SIGSTKFLT20)

SIGTSTP24)

SIGXCPU26)

SIGVTALRM 27)

SIGPROF30)

SIGPWR 31)

SIGSYS28)

SIGWINCHKill-l

命令显示系统信号1-31不可靠信号34-64

可靠信号可靠信号支持多次

,排队处理软帝信息科技http

下面是几个常见的信号。SIGHUP:从终端上发出的结束信号;SIGINT:来自键盘的中断信号(Ctrl-C);SIGQUIT:来自键盘的退出信号(Ctrl-\);SIGFPE:浮点异常信号(例如浮点运算溢出);SIGKILL:该信号结束接收信号的进程;SIGALRM:进程的定时器到期时,发送该信号;SIGTERM:kill

命令发出的信号;SIGCHLD:标识子进程停止或结束的信号;SIGSTOP:来自键盘(Ctrl-Z)或调试程序的停止执行信号…………软帝信息科技http

信号生命周期软帝信息科技http

可以要求系统在某个信号出现时按照下列三种方式中的一种进行操作。忽略此信号。大多数信号都可使用这种方式进行处理,但有两种信号却决不能被忽略。它们是:SIGKILL和SIGSTOP。这两种信号不能被忽略的原因是:它们向超级用户提供一种使进程终止或停止的可靠方法。另外,如果忽略某些由硬件异常产生的信号(例如

存储

或除以0),则进程的行为是未定义的。捕捉信号。为了做到这一点要通知内核在某种信号发生时,调用一个用户函数。在用户函数中,可执行用户希望对这种事件进行的处理。如果捕捉到SIGCHLD信号,则表示子进程已经终止,所以此信号的捕捉函数可以调用waitpid以取得该子进程的进程ID以及它的终止状态。执行系统默认动作。对大多数信号的系统默认动作是终止该进程。软帝信息科技http

每一个信号都有一个缺省动作,它是当进程没有给这个信号指定处理程序时,内核对信号的处理。有5种缺省的动作:异常终止(abort):在进程的当前

下,把进程的地址空间内容、寄存器内容保存到一个叫做core的文件中,而后终止进程。退出(exit):不产生core文件,直接终止进程。忽略(ignore):忽略该信号。停止(stop):挂起该进程。继续(continue):如果进程被挂起,则恢复进程的运行。否则,忽略信号。软帝信息科技http

信号发送与捕捉kill()和raise()kill()不仅可以中止进程,也可以向进程发送其他信号。与kill函数不同的是,raise()函数运行向进程自身发送信号。#include

<sys/types.h>#include

<signal.h>int

kill(pid_t

pid,

int

signo)

;int

raise(int

signo)

;两个函数返回:若成功则为0,若出错则为-1。软帝信息科技http

kill的pid参数有四种不同的情况:pid>0

将信号传给进程识别码为pid

的进程。pid=0

将信号传给和目前进程相同进程组的所有进程pid=-1

将信号广播传送给系统内所有的进程pid<0

将信号传给进程组识别码为pid绝对值的所有进程kill()实例见:kill.c软帝信息科技http

alarm和pause函数使用alarm函数可以设置一个时间值(闹钟时间),在将来的某个时刻该时间值会被超过。当所设置的时间值被超过后,产生SIGALRM信号。如果不忽略或不捕捉此信号,则其默认动作是终止该进程。#include

<unistd.h>unsigned

int

alarm(unsigned

int

seconds)

;返回:0或以前设置的闹钟时间的余留秒数软帝信息科技http

参数seconds的值是秒数,经过了指定的seconds秒后会产生信号SIGALRM。每个进程只能有一个闹钟时间。如果在调用alarm时,以前已为该进程设置过闹钟时间,而且它还没有超时,则该闹钟时间的余留值作为本次alarm函数调用的值返回。以前登记的闹钟时间则被新值代换。如果有以前登记的尚未超过的闹钟时间,而且seconds值是0,则取消以前的闹钟时间,其余留值仍作为函数的返回值。软帝信息科技http

pause函数使调用进程挂起直至捕捉到一个信号。#include

<unistd.h>int

pause(void);返回:-1,errno设置为EINTR只有执行了一个信号处理程序并从其返回时,pause才返回。实例见:alarm.c软帝信息科技http

信号的处理当系统捕捉到某个信号时,可以忽略该信号或是使用指定的处理函数来处理该信号,或者使用系统默认的方式。信号处理的主要方法有两种,一种是使用简单的signal函数,另一种是使用信号集函数组。Signal函数主要用于32种非实时信号处理。软帝信息科技http

signal()#include

<signal.h>void

(*signal

(int

signo,

void(*func)(int)))(int)返回:成功则为以前的信号处理配置,若出错则为SIG_ERRfunc的值是:(a)常数SIG_IGN,或(b)常数SIG_DFL,或

(c)当接到此信号后要调用的函数的地址。如果指定SIG_IGN,则向内核表示忽略此信号(有两个信号SIGKILL和SIGSTOP不能忽略)。如果指定SIG_DFL,则表示接到此信号后的动作是系统默认动作。当指定函数地址时,

称此为捕捉此信号。 称此函数为信号处理程序(signalhandler)或信号捕捉函数(signal-catching

function)。软帝信息科技http

软帝信息科技http

signal函数原型太复杂了,如果使用下面的typedef,则可使其简化。typedef

void

sign(int);sign

*signal(int,

handler

*);实例见:mysignal.c软帝信息科技http

信号集函数组需要有一个能表示多个信号——信号集(signal

set)的数据类型。将在sigprocmask()这样的函数中使用这种数据类型,以告诉内核不允许发生该信号集中的信号。信号集函数组包含几大模块:创建函数集、登记信号集、检测信号集。软帝信息科技http

信号操作一般流程SigemptysetSigaddset…Sigprocmask…定义信号集设置

位sa_masksa_handlersigaction…Sigpending…定义信号处理函数测试信号软帝信息科技http

创建函数集#include

<signal.h>int

sigemptyset(sigset_t

*

set)

;int

sigfillset(sigset_t*

set)

;int

sigaddset(sigset_t

*

set,int

signo)

;int

sigdelset(sigset_t

*

set,int

signo);四个函数返回:若成功则为0,若出错则为-1int

sigismember(const

sigset_t

*

set,

intsigno)

;返回:若真则为1,若假则为0。软帝信息科技http

sigemptyset:初始化信号集合为空。sigfillset:初始化信号集合为所有信号的集合。sigaddset:将指定信号添加到现存集中。sigdelset:从信号集中删除指定信号。sigismember:查询指定信号是否在信号集合中。软帝信息科技http

登记信号集登记信号处理机主要用于决定进程如何处理信号。首先要判断出当前进程阻塞能不能传递给该信号的信号集。这首先使用sigprocmask函数判断检测或更改 字,然后使用sigaction函数改变进程接受到特定信号之后的行为。软帝信息科技http

一个进程的字可以规定当前阻塞而不能递送给该进程的信号集。调用函数sigprocmask可以检测或更改(或两者)进程的字。#

include

<signal.h>int

sigprocmask(int

how,

const

sigset_t*

set,

sigset_t

*

oset)

;返回:若成功则为0,若出错则为-1oset是非空指针,进程的当前 字通过oset返回。其次,若set是一个非空指针,则参数how指示如何修改当前 字。软帝信息科技http

字的方法,how参数用sigprocmask更改当前设定:SIG_BLOCK该进程新的字是其当前希望阻塞的附字和set指向信号集的并集。set包含了加信号。SIG_UNBLOCK该进程新的字是其当前信号字和set所指向信号集的交集。set包含了 希望解除阻塞的信号。SIG_SETMASK该进程新的

是set指向的值。如果set是个空指针,则不改变该进程的 字,how的值也无意义。软帝信息科技http

sigaction函数的功能是检查或修改(或两者)与指定信号相关联的处理动作。此函数取代了UNIX早期版本使用的signal函数。#include

<signal.h>int

sigaction(int

signo,

const

struct

sigaction

*act,structsigaction

*

oact)

;返回:若成功则为0,若出错则为-1参数signo是要检测或修改具体动作的信号的数。若act指针非空,则要修改其动作。如果oact指针非空,则系统返回该信号的原先动作。此函数使用下列结构:struct

sigaction

{void

(*sa_handler)(int

signo);sigset_t

sa_mask;int

sa_flags;void

(*sa_restore);

}

;软帝信息科技http

sa_handler是一个函数指针,指定信号关联函数,可以是自定义处理函数,还可以SIG_DFL或SIG_IGN。sa_mask是一个信号集,它可以指定在信号处理程序执行过程中哪些信号应当被阻塞。sa_flags中包含许多标志位,是对信号进行处理的各种选项。具体如下:SA_NODEFER\SA_NOMASK:当捕捉到此信号时,在执行其信号捕捉函数时,系统不会自动阻塞此信号。SA_NOCLDSTOP:进程忽略子进程产生的任何SIGSTOP、SIGTSTP、SIGTTIN和SIGTTOU信号SA_RESTART:可让重启的系统调用重新起作用。SA_ONESHOT\SA_RESETHAND:自定义信号只执行一次,在执行完毕后恢复信号的系统默认动作。软帝信息科技http

检测信号集检测信号是信号处理的后续步骤,但不是必须的。sigpending函数运行进程检测“未决”信号(进程不清楚他的存在),并进一步决定对他们做何处理。sigpending返回对于调用进程被阻塞不能递送和当前未决的信号集。#include

<signal.h>int

sigpending(sigset_t

*

set)

;返回:若成功则为0,若出错则为-1信号集实例见:sigaction.c软帝信息科技http

共享内存共享内存区域是被多个进程共享的一部分物理内存。如果多个进程都把该内存区域到自己的虚拟地址空间,则这些进程就都可以直接该共享内存区域,从而可以通过该区域进行通信。共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容。软帝信息科技http

进程一进程二共享内存共享内存原理示意图软帝信息科技http

共享内存实现分为两个步骤:一、创建共享内存,使用shmget函数。到具体二、

共享内存,将这段创建的共享内存的进程空间去,使用shmat函数。软帝信息科技http

系统调用:shmget();原型:int

shmget

(

key_t

key,

int

size,

intshm

);返回值:如果成功,返回共享内存段标识符。如果失败,则返回-1:errno=EINVAL(无效的内存段大小)EEXIST(内存段已经存在,无法创建)EIDRM(内存段已经被删除)ENOENT(内存段不存在)EACCES(权限不够)ENOMEM(没有足够的内存来创建内存段)软帝信息科技http

软帝信息科技http

系统调用:shmat();原型:int

shmat

(

int

shmid,

char

*shmaddr,

int

shm

);返回值:如果成功,则返回共享内存段连接到进程中的地址。如果失败,则返回-1:errno=EINVAL(无效的IPC

ID

值或者无效的地址)ENOMEM(没有足够的内存)EACCES(存取权限不够)软帝信息科技http

软帝信息科技http

当一个进程不在需要共享的内存段时,它将会把内存段从其地址空间中脱离。系统调用:shmdt();调用原型:int

shmdt(char

*shmaddr);返回值:如果失败,则返回-1:errno=EINVAL(无效的连接地址)共享内存实例见:shmadd.c软帝信息科技http

软帝信息科技http

消息队列消息队列就是消息的一个链表,它允许一个或多个进程向它写消息,一个或多个进程从中读消息。具有一定的FIFO的特性,但是可实现消息的随即查询。这些消息存在于内核

中,由“队列ID”来标识。消息队列的实现包括创建和打开队列、添加消息、

消息和控制消息队列这四种操作。msgget:创建和打开队列,其消息数量受系统限制。msgsnd:添加消息,将消息添加到消息队列尾部。msgrcv:

消息,从消息队列中取走消息。msgctl:控制消息队列。软帝信息科技http

int

msgget

(key_tkey,

int

flag)key:返回新的或已有队列的ID,IPC_PRIVATEint

msgsnd

(int

msqid,

struct

msgbuf

*msgp,

size_tmsgsz,

int

flag)其中:msqid是消息队列的队列ID;msgp是消息内容所在的缓冲区;msgsz是消息的大小;msg

是标志,IPC_NOWAIT若消息并没有立交发送而调用进程会立即返回。软帝信息科技http

软帝信息科技http

struct

msgbuf{/*

type

of

message

*//*

message

text

*/long

mtype;char

mtext[1];};软帝信息科技http

3限公司http

int

msgr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论