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

时间:2021-08-22 01:31:48

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