进程间8种通信方式详解

< p > <强>进程通信:</强> < BR >每个进程各自有不同的用户地址,任何一个进程的变量变量在另一个,所以进程之间要交换数据必须通过,在内核中< / p>开辟一块,进程甲把数据从用户空间重叠到内核长度,进程乙再从内核本身把数据读走,内核提供的这种机制称为进程间。

< p > < BR > </ p>

<小时>

< p > < strong >匿名管道(管道):</ strong>管道是一种半双工的通信方式,数据只能 < strong >单向流动</ strong>,而且只能具有亲缘关系的进程间使用。进展的亲缘关系通常是指 < strong >父子进展关系</ strong>。。。</ p>

其中 socket表示服务器端的套接字描述符,address 表示需要绑定的本地地址,是一个 struct sockaddr_un 类型的变量,address_len 表示该本地地址的字节长度。


8.3 监听

服务器端套接字创建完毕并赋予本地地址值(名称,本例中为Server Socket)后,需要进行监听,等待客户端连接并处理请求,监听使用 listen 系统调用,接受客户端连接使用accept系统调用,它们的原形如下:

int listen(int socket, int backlog);

int accept(int socket, struct sockaddr *address, size_t *address_len);
  
  

其中 socket 表示服务器端的套接字描述符;backlog 表示排队连接队列的长度(若有多个客户端同时连接,则需要进行排队);address 表示当前连接客户端的本地地址,该参数为输出参数,是客户端传递过来的关于自身的信息;address_len 表示当前连接客户端本地地址的字节长度,这个参数既是输入参数,又是输出参数。


8.4 连接服务器

客户端套接字创建完毕并赋予本地地址值后,需要连接到服务器端进行通信,让服务器端为其提供处理服务。

对于SOCK_STREAM类型的流式套接字,需要客户端与服务器之间进行连接方可使用。连接要使用 connect 系统调用,其原形为

int connect(int socket, const struct sockaddr *address, size_t address_len);
  
  

    其中socket为客户端的套接字描述符,address表示当前客户端的本地地址,是一个 struct sockaddr_un 类型的变量,address_len 表示本地地址的字节长度。实现连接的代码如下:

    connect(client_sockfd, (struct sockaddr*)&client_address, sizeof(client_address));
      
      


      8.5 相互发送接收数据

      无论客户端还是服务器,都要和对方进行数据上的交互,这种交互也正是我们进程通信的主题。一个进程扮演客户端的角色,另外一个进程扮演服务器的角色,两个进程之间相互发送接收数据,这就是基于本地套接字的进程通信。发送和接收数据要使用 write 和 read 系统调用,它们的原形为:

      int read(int socket, char *buffer, size_t len);
      int write(int socket, char *buffer, size_t len);
        
        

        其中 socket 为套接字描述符;len 为需要发送或需要接收的数据长度;

        对于 read 系统调用,buffer 是用来存放接收数据的缓冲区,即接收来的数据存入其中,是一个输出参数;

        对于 write 系统调用,buffer 用来存放需要发送出去的数据,即 buffer 内的数据被发送出去,是一个输入参数;返回值为已经发送或接收的数据长度。


        8.6 断开连接

        交互完成后,需要将连接断开以节省资源,使用close系统调用,其原形为:

        int close(int socket);
          
          


          参考资料:

          发布了88 篇原创文章 · 获赞 51 · 访问量 9万+

          猜你喜欢

          转载自blog.csdn.net/weixin_43081805/article/details/102583711