找了很久也没有找到NSPipe在IOS方面的常规使用()。我试了半天终于找到它的正常的使用方法,我想对很多想使用管道会有很大的帮助。阿门,看来我是第一个吃螃蟹的人。
进程和线程间四大通信机制:管道,信号量,共享内存,socket。
四大通信机制的实际使用场景
管道是单向的、先进先出的,它把一个进程的输出和另一个进程的输入连接在一起。一个进程(写进程)在管道的尾部写入数据,另一个进程(读进程)从管道的头部读出数据。NSPipe包含两个文件描述符,读文件描述符合写文件描述。管道通常用在两个线程间通信或进程间通信。由于不能进程间不能共享全局变量,那么两个进程间要得到文件描述符FD,那么你只有通过读写本地文件来获得管道读文件描述符和写文件描述符。由于不同电脑的文件描述符不互相统属,所以管道不能对不同手机(电脑)间通信。不同电脑间通信用socket。若在应用中管道文件描述符全局变量,读端和写端都能访问到,那么他们肯定在一进程内,两个进程间肯定不可能访问到共同的全局变量。由于读写文件需要时间和一个写一个读的情况,所以不同进程间通信最好别用管道,除非你的管道需要长期保留并且保持可用,不常换管道描述才能用写FD到文件的方式。最佳的方式是用信号量。但是信号量只能当开关判断没有办法传递数据块,信号量本手机(电脑)唯一,所以可以实现进程间互相控制。更高级的你可以用SOCKET通信。注意在安卓环境下不能使用C语言调用共享内存,用JAVA可以调用共享内存,这个功能被安卓系统阉割了。IOS对共享内存的支持没有试过。
一台电脑的文件描述符最多理论上有65535,也就是能连接65535连接个socket,实际除掉保留的文件描述符,socket分配冲突问题,实际上只能保证连接20000个socket长连接,若再多的socket,只能采用负载均衡的策略,服务器需要搞集群了。
通过NSPipe创建一个管道,pipe有读端和写端。
然后通过写文件描述符(FD)写数据就可以,通过select函数判断是否可读,若可读就通过读文件描述符读到读缓冲区里就可以了。其它方式都被阻塞,纯属扯蛋。我已经实际实现。
下面是事例:
全局变量:
NSPipe * pipe = [NSPipe pipe] ;
NSFileHandle *pipeReadHandle = [pipe fileHandleForReading] ;
int pipeReadFd = [[pipe fileHandleForReading] fileDescriptor], fd];
int pipeWriteFd = [[pipe fileHandleForWriting] fileDescriptor], fd];
写管道处:
write( pipeWriteFd , @”send”, 4);
读管道处:
FD_ZERO(&client_fd_set);
FD_SET(pipeReadFd , &read_fd_set);
tv.tv_sec = 1;
tv.tv_usec = 0;
//socket一般都处于可写状态,除了网卡满了写不进去的罕见情况,所以该处侦听一般都是立刻响应
ret = select(pipeReadFd + 1, &pipeReadFd , NULL, &tv);
if (FD_ISSET(pipeReadFd , &read_fd_set))
{
unsign char Buff[21]= {0};
read( pipeReadFd , Buff, sizeof(Buff) );
}
版权声明:本文为博主原创文章,未经博主允许不得转载。