进程间通信----个人小结

2019-07-12 17:42发布

  学习一段时间的嵌入式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 #include #include   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 #include #include   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 #include #include
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