客户机-服务器通信
-
套接字
即socket,通信双方为套接字,比较常用
属于分布式进程间的一种低级形式的通信,交换无结构的字节流,客户机或者服务器需要自己加上数据结构。
-
RPC
远程过程调用,最常见的远程服务。
需要通信双方执行正好一次RPC,一般通过设定时间戳检测重复消息(将其忽略),服务器需要在接收到了之后对客户端发送确认(ACK)消息
其通信双方也是客户机的端口和服务器的端口,为了客户机一开始能直到服务器上的端口,一般有两种方法:
- 编程时预先固定好端口
- 服务器在一个固定RPC端口上提供交会服务程序(matchmaker),客户端发送一个包括RPC名称的消息到交会服务程序来请求所需RPC的端口地址
-
管道(只能用于同一个机器进程间通信)
-
普通管道
父进程创建用于和子进程通信
-
命令管道
mkfifo()函数,可以双向通信,但只允许半双工传输。通信进程依然需要位于同一台机器上面
-
管道使用的例子:
ls|more
该命令将ls的输出作为more的输入,从而用户可以一次一屏显示一个长的目录列表
windows也可以用dir|more产生同样效果
"|"就用来表示管道
补充
int main()
{
int i,pid;
for(i=0;i<4;++i){
pid=fork();
printf("pid:%d\n",pid);
}
while (1)
{
sleep(100);
}
return 0;
}
上述代码共生成了16个进程
──test─┬─test─┬─test─┬─test───test
│ │ └─test
│ ├─test───test
│ └─test
├─test─┬─test───test
│ └─test
├─test───test
└─test
(理解Linux系统中子进程复制父进程的程序和数据)
若改为如下
int main()
{
int i,pid;
for(i=0;i<4;++i){
pid=fork();
printf("pid:%d\n",pid);
if(!pid)
break;
}
while (1)
{
sleep(100);
}
return 0;
}
则共生成5个进程
──test───test───test───test───test