- 1、本文档共23页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
课程名称:网络程序设计6
课程名称:网络程序设计 主讲教师:胡亮 Email:hul@jlu.edu.cn 第6章 机内进程间通信 网络编程通常涉及多个进程之间相互作用,相互协调它们的活动。这一协调是通过进程间的某些主动或被动通信实现的。系统可以提供多种在一个节点上进程间通信方式,主要有信号(Signal)、管道(pipe)、命名管道(FIFOS)、消息队列(message queue)、信号灯(semaphore)、共享内存(shared memory)和内存映象(memory mapped file)以及UNIX域类型的套接字。 6.1 信号 信号是Unix系统中最原始的进程间同步和通信的工具,它实际上是发送给进程的“软件中断”,用于通知进程在它的运行环境中发生了某件事情。当引起信号的事件发生了,相应的信号就产生了。而当进程获得基于信号的行为时,这个信号就释放了,从信号的产生到信号被释放这段时间,称为信号的生命期。从信号的产生到信号的释放之间,信号可能被阻塞。通常是进程在执行某项任务时,不希望被相应的信号中断,这时进程可以阻塞这些信号。当进程完成任务时,再清除对这些信号的屏蔽,进程通过设置屏蔽码来实现信号的屏蔽。在进程阻塞期间产生的信号,进程仍然会收到,只是直到进程清除屏蔽后信号才被释放。 信号类似于硬件中断,但没有优先级,也就是说,进程平等地对待所有的信号。对于同时发生的信号,一次只给进程一个信号,而没有特别的次序。 Linux系统支持的信号 在Linux系统中,可以使用kill –l来显示系统中支持的信号,这些信号主要有: SIGHUP SIGINT SIGQUIT SIGILL SIGTRAP SIGIOT SIGBUS SIGFPE SIGKILL SIGUSER1 SIGSEGV SIGUSER2 SIGPIPE SIGALRM SIGTERM SIGCHLD SIGCONT SIGSTOP SIGTSTP SIGTTIN SIGTTOU SIGURG SIGXCPU SIGXFSZ SIGVTALRM SIGPROF SIGWINCH SIGIO SIGPWR 信号分类 可以根据信号的来源将信号进行分类: 进程在运行过程中出现了错误,触发系统的信号处理器对错误事件进行处理,这些信号是核心产生的。例如当进程遇到浮点运算错误,将触发SIGFPE信号进行相应的错误处理;段越界错误,核心将向进程发送SIGSEGV信号。 一个进程向另一个进程发送的信号,例如进程可以使用kill系统调用向某个进程或进程组发送信号,进程还可以使用raise向自己发送信号。 常用信号及其含义 信号的捕获和处理 Posix.1中的函数sigaction的功能是为进程安装信号处理器,struct sigaction数据结构用于保存信号处理器的相关信息。具体定义如下: #include signal.h int sigaction(int signo, const struct sigaction *act, struct sigaction *oact); struct sigaction { void (*sa_handler)(); /* the action to be taken*/ sigset_t sa_mask; int sa_flags; }; 在sigaction数据结构中,sa_handler是函数指针,当用户想捕获信号时,可以使sa_handler指向信号处理器的入口地址,即一个函数地址,只要该函数声明在调用sigaction之前,sa_handler就可以设置为该函数的名字,编译器会知道这个函数名代表的就是函数地址;如果用户想忽略信号的处理,可以使sa_handler等于SIG_IGN;如果用户想对信号进行缺省处理,可以使sa_handler等于SIG_DFL,核心对大多数信号的缺省处理是使进程退出。 信号集合设置 在Posix.1中,定义了sigset_t结构来实现信号集合,并提供了一组信号集合的操作函数,这些函数分别是: #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); int sigismember(const sigset_t *set
文档评论(0)