大家好,我是极客范的本期栏目编辑小友,现在为大家讲解linux进程间通信方式问题。
共用存储器
是多个进程共享的物理内存的一部分。共享内存是进程间共享数据的最快方式。当一个进程将数据写入共享内存区时,共享内存区的所有进程都可以立即看到内容。
共享内存的实现分为两个步骤:
1.创建共享内存并使用shmget函数。
第二,映射共享内存,将创建的共享内存映射到特定的进程空间,使用shmat函数。
当一个进程不再需要共享内存时,它需要与进程地址空间分离。
intshmdt(char*shmaddr)
信息排队
早期unix通信机制之一的signal只能传输有限的信息,而管道只能传输未格式化的字节流,这无疑会给应用开发带来不便。消息队列(也称为消息队列)克服了这些缺点。
发展
消息队列是消息的链接列表。您可以将消息视为具有特定格式的记录。该过程可以根据某些规则向添加新消息;其他进程可以从消息队列中读取消息。
目前,消息队列主要有两种类型:
目前广泛使用的是POSIX消息队列和系统V消息队列。
系统V消息队列在内核中是持久的,只有在内核重启或手动删除时才会被删除。
键值
消息队列的内核持久性要求每个消息队列对应于系统中唯一的键值。因此,要获得消息队列的描述字,必须提供消息队列的键值。
在以下两种情况下,会创建一个新的消息队列:
1.如果没有与关键字对应的消息队列,并且msgflg包含IPC_CREAT标志。
2.关键参数是IPC_PRIVATE。
文件
包括# include # includeintmsgsnd(intmsqid,structmsgbuf*msgp,intmsgsz,intmsgflg
功能:向消息队列发送消息。
Msqid:打开的消息队列id。
Msgp:存储消息的结构。
Msgsz:消息数据长度。
Msgflg:
发送标志,有意义的msgflg标志是IPC_NOWAIT,它指示当消息队列没有足够的空间容纳要发送的消息时,msgsnd是否会等待。
消息格式
structmsgbuf { longmtypecharm text[1];} *接收消息* # include # include # include intmsgrcv(intmsqid,structmsgbuf*msgp,intmsgsz,longmsgtyp,intmsgflg)。
功能:
从msqid表示的消息队列中读取一条msgtyp消息,并将该消息存储在msgp指向的msgbuf结构中。成功读取消息后,队列中的消息将被删除。
旗语
信号量(也称为信号灯)不同于其他进程间通信方法,其主要目的是保护关键资源。
根据它,进程可以确定它是否可以访问一些共享资源。除了访问控制,它还可以用于进程同步。
分类
二进制信号灯:信号灯的值只能取0或1,类似互斥锁。但它们是不同的:
强调信号灯的共享资源。只要共享资源可用,其他进程也可以修改信号灯的值。
互斥锁强调进程,进程本身在用完资源后必须解锁。
计数信号灯:信号灯的值可以取任意非负值。