进程和进程通信(二)

Posted by Distiny on May 7, 2022

客户机-服务器通信

  • 套接字

    即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