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

原文地址:https://www.cnblogs.com/lkq1220/p/6440095.html