常见进程间的几种通信方式以及使用注意点

常见进程间的几种通信方式以及使用注意点

通常情况下进程间的通信方式主要有以下几点:

此处只是介绍相关工作过程及概念,具体代码,网上一抓一大片,可以自己看。

1、管道:

管道通常分类两种,一种有名管道,一种无名管道无名管道:主要用于父子进程间的通信方式,主要的数据方式是一般是通过一个二维数组来进行通信,比如int pipefd[2],pipefd[0]主要是用来读数据,pipefd[1]主要是用来写数据。有名管道:也叫命名管道,这个主要是应用于非父子进程之间的一种数据通信方式,通常管道的使用过程总共分为三步:第一,创建管道,需要指定管道文件,第二步,打开管道文件,通常会有两种常见方式,以阻塞的方式打开或者非阻塞的方式开,第三步,就是管道的写,也会两种常见方式,以阻塞的方式写或者非阻塞的方式写,其中阻塞的读写指的是在读或者写的时候必须有一个个进程在写或者读操作。管道主要是进程间数据同步的一种方式,比如一个写数据,另一个读数据。

2、信号量

信号量也是常见的进程直接的一种数据共享方式,信号量的操作通常也是分为了三步,第一步创建信号量semget,这里面主要是需要确定key,第二步是初始化信号量semctl其中需要注意的就是第二个参数,一般使用0,表示这个一个唯一的信号量,第二个参数semun,一般采用默认值,这个联合结构体一般会在sem.h头文件中进行定义,可以直接使用即可,有关信号量的操作主要是第三步,就是信号量的操作了semop,这个里面主要是使用了

struct sembuf
{ 
    short sem_num;
    short sem_op;
    short sem_flg;
}

第一个参数,表示信号量编号,除非你使用一组信号量,一般使用0;第二个参数是信号量值的改变操作即P(+1)和V(-1)操作,第三个参数一般是SEM_UNDO,使得系统跟踪当前这个信号量使用情况,如果在当前进程结束情况下,这个信号量没有进行释放,则由系统自动释放该进程持有的这个信号量。信号量主要是进程间对于临界区代码权限访问控制的一种方式,确保了唯一访问以及操作性。

3、消息队列

消息队列在使用上与管道有很多相似的地方,但是比管道使用起来方便了很多,减少了管道的打开和关闭的操作,但是消息队列仍然没有解决在使用管道时遇见的管道满时的阻塞问题,消息队列与管道不同之处在于它独立于发送和接受进程,管道的阻塞模式则需要依赖于进程的发送和接收。消息队列使用的方式一般也是分为三步:

  • 第一步:创建消息队列msgget
  • 第二步:发送消息,即把消息添加到消息队列中去使用msgsnd(int msgid,const void *msg_pstr, size_t msg_sz, int msgflg)函数,主要参数需要注意的是第二个参数msg_pstr指针,这个消息指针的第一个参数必须是以一个长整型的成员变量开始,最后一个msgflg标示,主要是控制在消息队列满或者消息队列达到系统范围的限制时将要发生的事情,如果是IPC_NOWAIT,则函数立即返回,不发送消息,且返回值为-1,如果该标志位被清除,则发送进程将挂起,等待消息队列腾出空间。
  • 第三步:就是消息接受函数msgrcv(int msgid, void *msg_pstr, size_t msg_sz, long int msgtype, int msgflg) ,msg_pstr跟上面的一样,主要是msgtype标示接受消息的优先级,如果为0标示接受队列中第一个可用的消息,如果大于零,获取具有相同消息类型的第一个消息,msgflg用于控制队列中没有相应类型消息时候的操作,如果是IPC_NOWAIT则函数立即返回并且返回-1,如果IPC_NOWAIT被清除,则进程会挂起一直等待一小相应的类型消息出现为止。
4、共享内存

共享内存是在进程这几个通信方式中速度以及效率最高的一种方式,使用操作一般也分为三部分,第一步:创建共享内存,主要是设置共享内存的key以及大小,第二步绑定共享内存到指定内存地址,一般默认使用系统自己选择的地址,第三步:有两种操作方式1、shmdt将共享内存从当前进程剥离掉,但是未删除它,2、shmctl可以删除共享内存,直接物理删除该内存段。

进程间数据同步方式一般使用的都是共享内存,主要原因就是因为高效,但是共享内存在使用的时候有一个问题就是它无法确保数据的唯一性,没有提供数据同步的机制,通常情况下结合信号量或者互斥锁来进行数据的同步,比如使用互斥锁的时候,数据内容的定义如下:

struct sm_msg  
{  
    int flag;  
    pthread_mutex_t    sm_mutex;  
    char buf[SM_BUF_SIZE];  
}; 

在使用之前需要先解释一下互斥锁的使用情况。

经常使用的互斥锁是线程内的互斥锁,比如这种使用方式
初始化锁: int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutex_attr_t *mutexattr);
加锁:int pthread_mutex_lock(pthread_mutex *mutex);
解锁:int pthread_mutex_unlock(pthread_mutex *mutex);
销毁锁: int pthread_mutex_destroy(pthread_mutex *mutex);
对于mutexattr参数默认都会使用NULL,表示使用互斥锁的默认属性,表示为快速互斥锁,单互斥锁还有一种是进程互斥锁。

简单在此介绍下进程互斥锁的使用

pthread_mutex_attr_t *mutexattr;
初始化互斥锁pthread_mutexattr_init(&mattr),
属性的缺省值为 PTHREAD_PROCESS_PRIVATE。 该值表示可以在进程内使用经过初始化的互斥锁。mattr 范围可能的值为

  • PTHREAD_PROCESS_PRIVATE
  • PTHREAD_PROCESS_SHARED。

PTHREAD_PROCESS_PRIVATE 是缺省值。PTHREAD_PROCESS_PRIVATE表示由同一进程所创建的线程才能使用,要在多个进程中的线程之间共享互斥锁,可以在共享内存中创建互斥锁,并将pshared属性设置为 PTHREAD_PROCESS_SHARED,
通常使用pthread_mutexattr_setpshared来设置属性
pthread_mutexattr_setpshared(pthread_mutexattr_t *mattr, int pshared);

大致介绍完线程互斥锁,接下来说下如何使用该互斥锁;

使用的过程大致跟线程互斥锁使用方式一致,需要注意的是在调用pthread_mutex_init()的时候,需要使用pthread_mutex_init(sm_msg->sm_mutex, mutexatrr)的方式来初始化互斥锁,这样就可确保在进程中的数据的互斥性。

还有一种共享内存的同步方式就是使用信号量,具体使用过程如下介绍:

key_t semkey;
key_t shmkey;
//创建共享内存
shmid=shmget(shmkey,1024,0666|IPC_CREAT);
//创建信号量
semid=semget(semkey,1,0666|IPC_CREAT);
union semun{
int val;
struct semid_ds *buf;
unsignedshort*array;
}sem_u;
sem_u.val=1;/*设置变量值*/
semctl(semid,0,SETVAL,sem_u);//初始化信号量,设置第0个信号量
对于信号量P操作
共享内存操作
对于信号量V操作

以上就是有关进程间通信的常见的四种方式的概括,当然还有套接字的使用,下次再补充

多线程操作总结:http://blog.csdn.net/bingshiwuyu/article/details/78768515

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android进程通信(Inter-process Communication, IPC)是指在不同进程进行数据交互和通信的方法。Android提供了多种方式实现进程通信,以下是常用的几种方式: 1. Binder机制:Binder是一种跨进程通信技术,它基于Linux内核提供的Binder驱动。通过Binder,我们可以将一个Service注册为Binder服务,其他进程可以通过Binder进行远程调用,实现进程通信。 2. 文件共享:进程可以通过共享文件的方式实现通信。一个进程将数据写入文件,其他进程读取该文件数据,从而实现进程的信息传递。 3. Socket通信:可以使用Socket套接字进行进程通信。一个进程作为服务器,另一个进程作为客户端,通过Socket建立连接进行数据交互。 4. ContentProvider:ContentProvider是Android中用于实现进程共享数据的一种组件。通过ContentProvider,一个进程可以提供数据给其他进程进行读写操作。 5. BroadcastReceiver:广播是一种常见进程通信方式。一个进程发送广播消息,其他进程通过注册相应的广播接收器来接收并处理广播消息。 6. Messenger:Messenger是一种轻量级的进程通信方式。通过Messenger,一个进程可以发送消息给另一个进程,实现进程通信。 以上是常用的几种Android进程通信方式,开发者可以根据具体需求选择合适的方式来实现进程通信

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值