zoukankan      html  css  js  c++  java
  • Android系统--输入系统(三)必备Linux知识_双向通信(scoketpair)

    Android系统--输入系统(三)必备Linux知识_双向通信(scoketpair)

    引入

    1. 进程和APP通信

    • 创建进程

    • 读取、分发

      - 进程发送输入事件给APP
      
      • 进程读取APP回应的事件
    • 输入系统涉及双向的进程间通信

    2. 回顾Binder系统

    • Server-- 单向发出请求

    • Client -- 单向回复请求

    • 每次请求只可以单方发出

    3. 引入Socketpair

    • 原因:如果创建两组进程(Client,Server)进行双向通信,实现十分复杂

    • 引入Socketpair:

    1. Socketpair();两次,获得两个fd,在内核获得缓冲区,一个作为sendbuf区一个作为receivebuf区

    2. APP通过fd1将数据写入fd1的sendbuf区中,通过内核当中的socket机制就会写到fd2中receivebuf区,同理fd2也是如此

    • socketpair缺点:只适用于线程间、父子进程通信

    • 解决方法:通过Binder机制通信可以访问任意进程,就解决了sockpair缺点(具体见输入系统(四))

    4. socketpair具体使用

    1. 创建一个线程--pthread_create();

    2. 创建socketpair--socketpair(AF_UNIX, SOCK_SEQPACKET, 0, sockets);

    3. 线程处理函数--往socket[1]写入数据,读取socket[0]读取数据

    4. 主函数--从socket[1]读取数据,往socket[0]写入数据

    实现代码:
    
    #include <pthread.h>
    
    #include <unistd.h>
    
    #include <stdio.h>
    
    #include <sys/types.h>          /* See NOTES */
    
    #include <sys/socket.h>
    
    #define SOCKET_BUFFER_SIZE      (32768U)
    
    #define MAX 512
    
    /* 参考:
    
     * frameworks
    ativelibsinputInputTransport.cpp
    
     */
    
     
    
    /* 线程执行函数 */ 
    
    int *function_thread(void *arg)
    
    {
    
        int thread1_fd = (int)arg;
    
    	int cnt=0;
    
    	int len;
    
    	char buf[MAX];
    
    	
    
        while(1){
    
    	    /* 向 main线程发出: Hello, main thread	*/
    
    		len = sprintf(buf,"Hello , main thread , cnt = %d",cnt++);
    
    		write(thread1_fd,buf,len);
    
    	   
    
    	    /* 读取数据(main线程发回的数据) */
    
    	    len = read(thread1_fd,buf,MAX);
    
    		buf[len] = '';
    
    		printf("thread1 read : %s
    ",buf);
    
    		sleep(5);
    
        }
    
    	close(thread1_fd);
    
    	return NULL;
    
    	
    
    }
    
    int main(int argc,char *argv[])
    
    {
    
        pthread_t threadID;
    
        int sockets[2];
    
        int bufferSize = SOCKET_BUFFER_SIZE;
    
    	
    
    	socketpair(AF_UNIX,SOCK_SEQPACKET,0,sockets);  //创建socketpair
    
     
    
        //初始化
    
        setsockopt(sockets[0], SOL_SOCKET, SO_SNDBUF, &bufferSize, sizeof(bufferSize));
    
        setsockopt(sockets[0], SOL_SOCKET, SO_RCVBUF, &bufferSize, sizeof(bufferSize));
    
        setsockopt(sockets[1], SOL_SOCKET, SO_SNDBUF, &bufferSize, sizeof(bufferSize));
    
        setsockopt(sockets[1], SOL_SOCKET, SO_RCVBUF, &bufferSize, sizeof(bufferSize));
    
        
    
    	pthread_create(threadID,NULL,function_thread,(void *)sockets[1]);  //创建线程
    
    	int mainThread_fd = sockets[0];
    
    	int cnt=0;
    
    	int len;
    
    	char buf[MAX];
    
        while(1){
    
    		/* 读数据: 线程1发出的数据 */
    
    	    len = read(mainThread_fd,buf,MAX);
    
    		buf[len] = '';
    
    		printf("main thread read : %s
    ",buf);
    
    		
    
    		/* main thread向thread1 发出: Hello, thread1 */
    
    		len = sprintf(buf,"Hello , thread1 , cnt = %d",cnt++);
    
    		write(mainThread_fd,buf,len);		
    
        }	
    
    	
    
    	close(mainThread_fd);
    
        return 0;
    
    }
    
    
    使用方法:
    • gcc socketpair.c -o socketpair -pthread 注:出现少量警告,可以忽略

    • ./socketpair

  • 相关阅读:
    $("*")选取所有的元素
    $("p") 选取多有的元素
    $(".test")选取所有class为test的元素
    $("#test")选取id为test的元素
    数据分析工具的深度对比:FineBI vs PowerBI
    Kafka是如何处理Netflix每天2万亿条消息的?
    新补丁更新(RU和RUR),新的版本(Release 18和19)
    Cinder 的 I/O QoS
    Web前端绘制0.5像素的几种方法
    Web前端绘制0.5像素的几种方法
  • 原文地址:https://www.cnblogs.com/lkq1220/p/6440095.html
Copyright © 2011-2022 走看看