管道,信号量,共享内存,socket的实际使用场景和NSPipe管道的使用

找了很久也没有找到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) );
             }

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-03 07:07:01

管道,信号量,共享内存,socket的实际使用场景和NSPipe管道的使用的相关文章

Linux进程间通信(消息队列/信号量+共享内存)

写在前面 不得不说,Deadline果真是第一生产力.不过做出来的东西真的是不堪入目,于是又花了一早上重写代码. 实验内容 进程通信的邮箱方式由操作系统提供形如 send()和 receive()的系统调用来支持,本实验要求学生首先查找资料了解所选用操作系统平台上用于进程通信的系统调用具体形式,然后使用该系统调用编写程序进行进程间的通信,要求程序运行结果可以直观地体现在界面上.在此基础上查找所选用操作系统平台上支持信号量机制的系统调用具体形式,运用生产者与消费者模型设计实现一个简单的信箱,该信箱

linux下多进程+信号量+共享内存编程

此程序实现没有亲缘关系的两个进程间通过共享内存进行数据通信. 同时,使用信号量保证两个进程的读写同步:发送方在写共享内存时,接收方不能读数据:接收方在读数据时,发送方不能写数据. 1.fork创建子进程 2.使用二元信号量,同步读写端 fork_shm.c #include<stdio.h> #include<sys/types.h> #include<unistd.h> #include"send_recv.h" int main(void) {

进程间通信第二课--信号量 共享内存 消息队列

信号量 程序中存在一部分临界代码,要确保只有一个进程(或一个执行线程)可以进入临界区代码,并拥有对资源的独占式访问权 我们需要一种方法,通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域 这里讲的信号量比在线程的调用中使用的互斥量和信号量更加通用 P:等待,好像位于进入临界区域之前的检查点 V:给予或者释放,好像放弃对临界区域的控制权 P(sv):要是sv的值大于零,就减去1,如果它的值等于零,就挂起该进程的执行 V(sv):要是其他进程因等待sv而被挂起,就让它恢复运行,

撸代码--类QQ聊天实现(基于linux 管道 信号 共享内存)

一:任务描述 A,B两个进程通过管道通信,像以前的互相聊天一样,然后A进程每次接收到的数据通过A1进程显示(一个新进程,用于显示A接收到的信息),A和A1间的数据传递采用共享内存,对应的有一个B1进程,用于显示B进程接收到的信息.针对A,B进程,退出时采用ctrl+c退出,当收到对应信号后,自身进程能够通过信号处理函数进行资源清理,清理后exit退出进程.(A1,B1,手动关闭即可).界面图如下. 二:代码展示 A进程 #include <stdlib.h> #include <stdi

管道,消息队列,共享内存!

2015.1.26星期一,阴天 linux中使用的较多的进程通信方式主要有一下几种:1.管道(Pipe):管道可用于具有亲缘关系进程间的通信,有名管道,除了具有管道所具有功能外,它 还允许无亲缘关系进程的通信2.信号(signal):信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程 有某事发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一样的3.消息队列:(Messge Queue):消息队列是消息的连接表,包括Posix消息队列SystemV消息队列

进程间通信(IPC)——信号量、共享内存、消息队列

IPC(Inter-Process Communication)主要手段:信号量.共享内存.消息队列.另外还有:管道.Socket等. 非网络IPC和网络IPC(Socket API)都是需要的. IPC按形式上分可分成4种不同的IPC形式: 1)消息传递(管道.FIFO命名管道.消息队列) 2)同步(互斥量.条件变量.读写锁.文件和记录锁.信号量) 3)共享内存(匿名的和具名的) 4)远过程调用(Solaris门和SunRPC) ipcs -s:观察信号量信息.文件:/proc/sysvipc

Linux进程IPC浅析[进程间通信SystemV共享内存]

Linux进程IPC浅析[进程间通信SystemV共享内存] 共享内存概念,概述 共享内存的相关函数 共享内存概念,概述: 共享内存区域是被多个进程共享的一部分物理内存 多个进程都可把该共享内存映射到自己的虚拟内存空间,所有用户空间的进程若要操作共享内存,都要将其映射到自己的虚拟内存空间中,通过映射的虚拟内存空间地址去操作共享内存,从而达到进程间的数据通信 共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容 本身不提供同

【网络编程基础】Linux下进程通信方式(共享内存,管道,消息队列,Socket)

在网络课程中,有讲到Socket编程,对于tcp讲解的环节,为了加深理解,自己写了Linux下进程Socket通信,在学习的过程中,又接触到了其它的几种方式.记录一下. 管道通信(匿名,有名) 管道通信,在一个进程之中,只能单一的对其写或者是读,而不可以及执行写操作又执行读操作.这一点,我们可以将其想象成我们的水管,分别连着不同的两端,在有水流的时候,一端只能进行输入,另一端只能进行输出,而不可以同时输入和输出. 管道又分为有名管道和匿名管道,两者的区别在于对于匿名管道,其只能在具有亲缘关系的父

Linux进程间通信:管道,信号量,消息队列,信号,共享内存,套接字

Linux下的进程通信手段基本上是从UNIX平台上的进程通信手段继承而来的.而对UNIX发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间的通信方面的侧重点有所不同.前者是对UNIX早期的进程间通信手段进行了系统的改进和扩充,形成了“system V IPC”,其通信进程主要局限在单个计算机内:后者则跳过了该限制,形成了基于套接口(socket)的进程间通信机制.而Linux则把两者的优势都继承了下来 linux进程间通信(IPC)有几种方式