嵌入式技术学习笔记(八)

进程间通信
1、管道
管道可以分为无名管道和有名管道,只允许有血缘关系的进程间通信
无名管道只可用于父子进程之间通信
有名管道可以用于系统中任意两个进程之间通信
无名管道:int pipe(int pipefd[2])
fd[0]为读,fd[1]为写
pipefd用于获取管道文件描述符
管道只允许单向通信
有名管道:int mkfifo(const char *pathname,mode_t mode)
有名管道这种特殊文件,只能使用mkfifo函数来创建,为了保证管道一定被创建,最好两个进程都包含创建管道的代码,谁先运行就谁先创建。
不能以O_RDONLY模式打开有名管道fifo文件,否则其行为是未定义的。
2、消息队列
消息队列的本质就是内核创建的存放消息的链表,由于是存放消息的,所以我们把这个链表称为消息队列
消息队列特点:(1)传送有格式的消息流(2)多进程网状交叉通信时,消息队列是上上之选(3)能实现大规模数据的通信
定义一个消息:
struct msgbuf{
long mtype; 放消息编号,必须大于0
char mtext[msgsz]; 消息内容
}
使用步骤:①使用msgget函数创建新的消息队列,或者获取已存在的某个消息队列,并返回唯一标识消息队列的标识符(msqID),后续收发消息就是使用这个标识符来实现的②收发消息③使用msgctl函数,利用消息队列标识符删除消息队列
消息队列API:
int msgget(key_t key,int msgflg)
int msgsnd(int msqid,const void *msgp,size_t msgsz,int msgflg)
ssize_t msgrcv(int msqid,void *msgp,size_t msgsz,long msgtyp,int msgflg)
int msgctl(int msqid,int cmd,struct msqid_ds *buf)
msqid表示哪个队列 msgp表示什么内容,msgsz表示多少长度,msgflg表示以什么样的形式
3、共享内存
让同一块物理内容被映射到进程A,B各自的进程地址空间。进程A可以即时看到进程B对共享内容中数据的更新
共享内存API:
int shmget(key_t key,size_t size,int shmflg)
void *shmat(int shmid,const void *shmaddr,int shmflg)
int shmdt(const void *shmaddr)
int shmctl(int shmid,int cmd,struct shmid_ds *buf)
特点:减少进入内核空间的次数;直接使用地址来读写缓存时,效率会更高,适用于大数据量的通信
4、信号量
当多个进程/线程进行共享操作时,用于资源保护,以防出现相互干扰的情况
资源保护的操作:①互斥:对于互斥操作来说,多进程共享操作时,多个进程不关心谁先操作,谁后操作问题,它们只关心一件事,那就是我在操作的时候别人不能操作②同步:所谓的同步为,多个共享操作时,进程必须要有统一操作的步调,按照一定的顺序操作
解决办法为加锁
信号量API:
int semget(key_t key,int nsems,int semflg)
int semctl(int semid,int semnum,int cmd,…)
int semop(int semid,struct sembuf *sops,unsigned nsops)

你可能感兴趣的:(嵌入式技术学习笔记(八))