为什么要进程通信?数据传输、资源共享、通知事件、进程控制。
IPC由一下三部分发展而来:UNIX进程间通信、基于System V进程间通信、POSIX进程间通信。
最初开发POSIX是为了提高UNIX环境下应用程序的可移植性。DEC的OpenVMS和Windows都支持POSIX。
进程通信的方式:管道和有名管道、信号、消息队列、共享内存、信号量、套接字。
管道是单向的,先进先出的,把一个进程的输出和一个进程的输入连接在一起,一个进程(写进程)在管道的尾部写入数据,另一个进程(读进程)从管道的头部读取数据。数据被一个进程读出后,将被从管道中删除。进程试图读空管道和向满的管道写数据都将阻塞。
无名管道用于父子进程之间的通信,有名管道可以用于同一系统中的任意两个进程之间。
一个管道建立时会创建两个文件描述符,filedis[0]用于读管道,filedis[1]用于写管道。
通常先创建一个管道,再通过fork函数创建一个子进程,该子进程会继承父进程所创建的管道。必须在fork之前调用pipe,让子进程继承文件描述符。
创建有名管道,mkfifo。
当用户按某些键产生信号,硬件异常产生信号,进程用kill函数将信号发送给另一个进程,用kill命令发送信号。
信号处理方式:1.忽略,但是SIGKILL和SIGSTOP不能忽略,它们向超级用户提供了一种终止或停止进程的方法。2.执行用户希望的动作。通知内核在某种信号发生时,调用一个用户函数,在用户函数中,执行用户希望的处理。3.执行系统默认的动作。对大多数信号的默认操作是终止该进程。
发送信号的主要函数有kill和raise,kill既可以向自身发送信号,也可以向其他进程发送信号。raise是向进程自身发送信号。alarm函数可以设置一个时间值,当所设置的时间到了时,产生SIGALRM信号,如果不捕捉此信号,则默认动作是终止该进程。pause函数使调用进程挂起直至捕捉到一个信号,只有执行了一个信号处理函数后,挂起才结束。
信号处理的方法:一种是使用简单的signal函数,另一种是使用信号集函数组。
共享内存实现分为两个步骤:1.创建共享内存shmget。2.映射共享内存,将这段创建的共享内存映射到具体的进程空间去,shmat。解除映射,shmdt。
浙公网安备 33010602011771号