2011-12-21 第十五章 进程间通讯
第一节 引言
1,过去,UNIX系统IPC是各种进程通讯方式的统称。
2,套接字和STREAMS是仅有的两种支持不同主机上各个进程间IPC的类型。
第二节 管道
1,管道使用例程:
int main()
{
int n,fd[2];
pid_t pid;
char line[MAXLINE];
if(pipe(fd) < 0)
err_sys("pipe error");
if(pid = fork() < 0)
err_sys("fock error");
else if(pid > 0){
close(fd[0]);
write(fd[1],"hello world\n",12);
} else {
close(fd[1]);
n = read(fd[0],line,MAXLINE);
write(STDOUT_FILENO,line,n);
}
exit(0);
}
第三节 popen和pclose函数
1,这两个函数实现的操作是:创建一个管道,调用fork产生一个子进程,关闭管道的不使用端,执行一个shell以运行命令,然后等待命令终止。
第四节 协同进程
1,当一个程序产生某个过滤程序的输入,同时又读取该过滤程序的输出时,则该过滤程序就成为协同进程。
2,注意协同进程的IO缓冲方式,以避免死锁的产生。
第五节 FIFO
1,FIFO有时被称为命名管道。FIFO是一种文件类型。
2,FIFO有下面两种用途:
a,FIFO由shell命令使用以便将数据从一条管道线传送到另一条,为此无需创建中间临时文件。
b,FIFO用于客户进程-服务器进程应用程序中,以在客户进程和服务器进程之间传递数据。
3,管道只能用于进程间的线性连接,然而,因为FIFO具有名字,它可以用于非线性连接。
第六节 XSI IPC
1,有三种IPC我们称为XSI IPC,即消息队列,信号量以及共享存储器。
2,以参数key和flag创建IPC结构,返回其标识符,以其引用该IPC结构。
3,IPC_PRIVATE是键,IPC_CREATE和IPC_EXCL是flag的位标志。
4,XSI IPC为每一个IPC结构设置了一个ipc_perm结构。该结构规定了权限和所有者。
5,XSI IPC的主要问题是:
a,IPC结构是在系统范围内起作用的,没有访问计数。
b,这些IPC结构在文件系统中没有名字。为了支持它们,不得不增加了十几条新的系统调用和一些新的命令。
c,IPC结构不使用文件描述符,不能对它们使用多路转接IO函数。
第七节 消息队列
1,megget用于创建一个新的消息队列或打开一个现存的队列。
2,msgsnd将数据放到消息队列中。
3,msgrcv从消息队列中取用函数。
4,msgctl对消息队列指定执行多种操作。
5,在新的应用程序中不应当再使用消息队列。
第八节 信号量
1,信号量是一个计数器,用于安排多个进程对共享数据对象的访问。
2,一个信号量控制一个共享资源的使用情况。
3,使用信号量要先创建一个信号量集,调用函数semget。
4,semctl函数包含了多种信号量的操作。
5,函数semop自动原子性地执行信号量集合上的操作数组。
6,虽然记录锁慢于信号量,但如果只需锁一个资源并且不需要使用XSI信号量的所有花销功能,则宁可使用记录锁。理由是使用简易,且进程终止时系统会处理任何遗留下来的锁。
第九节 共享存储
1,共享存储允许两个或更多进程共享一给定的存储区。因为数据不需要在客户进程和服务器之间复制,所以这是最快的一种IPC。
2,使用共享存储时需要掌握的唯一窍门是多个进程之间对一给定存储区的同步访问。
3,通常,信号量被用来实现对共享存储访问的同步。(记录锁也可以)。
4,调用shmget获得一个共享存储标识符。
5,shmctl对共享存储段执行多种操作。
6,共享存储段创建之后就可以使用shmat连接它的地址空间。
7,当对共享存储段的操作已经结束的时候,调用shmdt脱接该段。
8,使用存储映射使用/dev/zero的优点是:在调用mmap创建映射区之前,无需存在一个实际文件。其缺点是:只能在相关进程间起作用。另外,对比/dev/zero的更好选择,还可使用匿名存储映射。
第十节 客户进程-服务器进程属性
1,客户进程和服务器进程的某些属性会受到它们之间所使用的IPC类型的影响。
ps:2011年的最后一天算是第一次结束了这一章了。仅限勉强有个概念的程度。