学习一段时间的嵌入式LINUX,参考着《嵌入式Linux应用程序开发标准教程》(第2版)中的第8章内容----《进程间通信》,个人简要地做个小结,来加强自己的学习记忆,比较简略,只是起到一些提纲和触发回忆的作用,希望也能够对读者有帮助。
8.1 Linux下进程通信概述
主要以下几种方式:
(1)管道(pipe)及有名管道(named pipe)
(2)信号(signal)
(3)消息队列(message queue)
(4)共享内存(shared memory)
(5)信号量(semaphore)
(6)套接字(socket)
8.2 管道
8.2.1 管道概述
无名管道只能是父子进程之间的管道通信。
int pipe(int fd[2]) 返回值 0:成功 -1:出错
读写说明:分别把两进程中其中的读或写给关掉
一些注意点说明...
8.2.3 标准流管道
popen() pclose()
8.2.4 FIFO
1.有名管道说明
可以使不相关的两个进程实现彼此互相通信。
阻塞和非阻塞的区别 P240
mkfifo() 一些相关函数资料 P240
8.3 信号
8.3.1 信号概述
最古老的方法,软件层次上对中断机制的一种模拟。
3个重要阶段,用4个重要事件来刻画:
信号产生、信号在进程中注册、信号在进程中注销、执行信号处理函数。
用户进程对信号的响应可以有3种方式: P244
1.忽略信号, 不能忽略SIGKILL SIGSTOP。
2.捕捉信号,执行自定义信号处理函数。
3.执行默认LINUX操作。
8.3.2 信号发送与捕捉
1. kill() raise()
2. alarm() pause()
8.3.3 信号的处理
1.信号处理函数
1. signal() 原型: void(*signal(int signum, void(*handler)(int)))(int)
替换说明:
typedef void sign(int);
sign *signal(int, handler *);
2. sigaction() 更健壮、更新的信号处理函数
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact) 成功:0 出错:-1
2.信号集函数组 P252
- int sigemptyset(sigset_t *set)
- int sigfillset(sigset_t *set)
- int sigaddset(sigset_t *set, int signum)
- int sigdelset(sigset_t *set, int signum)
- int sigismember(sigset_t *set, int signum)
8.4 信号量
8.4.1 信号量概述
PV原语
P操作:有资源时候(信号量值 > 0)则占用一个资源(信号量减1);若没有资源(信号量 = 0),则被阻塞直到系统将资源分配给该进程(进入等待队列,一直等到资源轮到该进程)。
V操作:若等待队列中有进程在等待资源,则唤醒一个阻塞进程。如果没有进程等待它,则释放一个资源(给信号量值加1)。
8.4.2 信号量的应用
1.函数使用说明
(1)用同一个信号量键值获得同一个信号量 semget()
(2)初始化信号量 semctl()函数的SETVAL操作
(3)进行信号量的PV操作,调用semop() 实现进程之间的同步和互斥的核心步骤
(4)若不需要信号量,则删除,调用semctl的IPC——RMID操作。
2.函数格式
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/sem.h>
int semget(key_t key, int nsems, int semflg) 成功:返回信号量标识符semid 出错:-1
int semctl(int semid, int semnum, int cmd, union semun arg) 成功:根据cmd值的不同而返回不同的值 出错:-1
int semop(int semid, struct sembuf *sops, size_t nsops) 成功:0 出错:-1
8.5 共享内存
8.5.1 共享内存概述
最为高效的进程间通信方式。当多个进程共享一段内存时候,需要依靠某种同步机制,如互斥锁或者信号量
8.5.2 共享内存的应用
1.函数说明
使用流程:
1.创建共享内存:shmget()
2.映射共享内存:shmat()
3.撤销映射: shmdt()
2.函数格式
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
int shmget(key_t key, int size, int shmflg) 成功:共享内存段标识符 出错:-1
char *shmat(int shmid, const void *shmaddr, int shmflg) 成功:被映射的段地址 出错:-1
int shmde(const void *shmaddr) 成功:0 出错:-1
8.6 消息队列
8.6.1 消息队列概述
消息的列表,具有一定的FIFO特性,可以实现消息的随即查询,存在与内核中,由”队列ID“来标识。
8.6.2 消息队列的应用
1.函数说明
(1)创建或打开消息队列 msgget()
(2)添加消息 msgsnd()
(3)读取消息 msgrcv() ----同FIFO不同的是,这里可以指定取走某一条消息
(4)控制消息队列 msgctl()
2.函数格式
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
int msgget(key_t key, int msgflg) 成功:消息队列ID 出错:-1
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg) 成功:0 出错:-1
int msgrcv(int msqid, void *msgp, size_t msgsz, long int msgtyp, int msgflg) 成功:0 出错:-1
int msgctl(int msqid, int cmd, struct msqid_ds *buf)
8.7 实验内容
8.7.1 管道通信实验 P271
8.7.2 共享内存实验 P275
原创文章,欢迎转载,转载请注明:blog.csdn.net/jjzhoujun2010
作者:Dream Fly