Android系统--输入系统(三)必备Linux知识_双向通信(scoketpair)
引入
1. 进程和APP通信
-
创建进程
-
读取、分发
- 进程发送输入事件给APP
- 进程读取APP回应的事件
-
输入系统涉及双向的进程间通信
2. 回顾Binder系统
-
Server-- 单向发出请求
-
Client -- 单向回复请求
-
每次请求只可以单方发出
3. 引入Socketpair
-
原因:如果创建两组进程(Client,Server)进行双向通信,实现十分复杂
-
引入Socketpair:
-
Socketpair();两次,获得两个fd,在内核获得缓冲区,一个作为sendbuf区一个作为receivebuf区
-
APP通过fd1将数据写入fd1的sendbuf区中,通过内核当中的socket机制就会写到fd2中receivebuf区,同理fd2也是如此
-
socketpair缺点:只适用于线程间、父子进程通信
-
解决方法:通过Binder机制通信可以访问任意进程,就解决了sockpair缺点(具体见输入系统(四))
4. socketpair具体使用
-
创建一个线程--pthread_create();
-
创建socketpair--socketpair(AF_UNIX, SOCK_SEQPACKET, 0, sockets);
-
线程处理函数--往socket[1]写入数据,读取socket[0]读取数据
-
主函数--从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