佛山企业网站建设教程,平面设计包括哪些内容,餐饮门户网站源码,阜宁做网站需要多少钱1.进程间通信 1.1 进程间通信目的
数据传输#xff1a;一个进程需要将它的数据发送给另一个进程资源共享#xff1a;多个进程之间共享同样的资源。通知事件#xff1a;一个进程需要向另一个或一组进程发送消息#xff0c;通知它#xff08;它们#xff09;发生了某种事件…1.进程间通信 1.1 进程间通信目的
数据传输一个进程需要将它的数据发送给另一个进程资源共享多个进程之间共享同样的资源。通知事件一个进程需要向另一个或一组进程发送消息通知它它们发生了某种事件如进程终止时要通知父进程。进程控制有些进程希望完全控制另一个进程的执行如Debug进程此时控制进程希望能够拦截另一个进程的所有陷入和异常并能够及时知道它的状态改变。
数据传输一个进程需要将它的数据发送给另一个进程
资源共享多个进程之间共享同样的资源。
通知事件一个进程需要向另一个或一组进程发送消息通知它它们发生了某种事件如进程终止
时要通知父进程。
进程控制有些进程希望完全控制另一个进程的执行如Debug进程此时控制进程希望能够拦截另
一个进程的所有陷入和异常并能够及时知道它的状态改变。 1.2 进程间通信发展
管道System V进程间通信POSIX进程间通信 1.3 进程间通信分类 1.3.1 管道
匿名管道pipe命名管道 1.3.2 System V IPC
System V 消息队列System V 共享内存System V 信号量 1.3.3 POSIX IPC
消息队列共享内存信号量互斥量条件变量读写锁 2.管道具有亲缘关系
管道是Unix中最古老的进程间通信的形式。
我们把从一个进程连接到另一个进程的一个数据流称为一个“管道” 2.1 用fork来共享管道原理 2.2 匿名管道
#include unistd.h
功能:创建一无名管道
原型
int pipe(int fd[2]);
参数
fd文件描述符数组,其中fd[0]表示读端, fd[1]表示写端
返回值:成功返回0失败返回错误代码
实例代码
打开管道
获取键盘stdin的数据读到buf中
把buf中的数据写到管道中
从管道中把数据写到回buf中
再把buf中的数据写到stdout中 2.3 站在文件描述符角度-深度理解管道 2.4 站在内核角度-管道本质 所以看待管道就如同看待文件一样管道的使用和文件一致迎合了“Linux一切皆文件思想”。 在my_shell中添加管道的实现
添加功能 2.5 管道读写规则
当没有数据可读时
O_NONBLOCK disableread调用阻塞即进程暂停执行一直等到有数据来到为止。
O_NONBLOCK enableread调用返回-1errno值为EAGAIN。
当管道满的时候
O_NONBLOCK disable write调用阻塞直到有进程读走数据
O_NONBLOCK enable调用返回-1errno值为EAGAIN
如果所有管道写端对应的文件描述符被关闭则read返回0
如果所有管道读端对应的文件描述符被关闭则write操作会产生信号SIGPIPE,进而可能导致write进程
退出
当要写入的数据量不大于PIPE_BUF时linux将保证写入的原子性。
当要写入的数据量大于PIPE_BUF时linux将不再保证写入的原子性。 2.6 管道特点
linux中一个匿名管道的文件描述符被关闭就不能再被打开了所以只能实现单向通信
只能用于具有共同祖先的进程具有亲缘关系的进程之间进行通信通常一个管道由一个进程创
建然后该进程调用fork此后父、子进程之间就可应用该管道。
管道提供流式服务
一般而言进程退出管道释放所以管道的生命周期随进程
一般而言内核会对管道操作进行同步与互斥
管道是半双工的数据只能向一个方向流动需要双方通信时需要建立起两个管道3. 命名管道
管道应用的一个限制就是只能在具有共同祖先具有亲缘关系的进程间通信。如果我们想在不相关的进程之间交换数据可以使用FIFO文件来做这项工作它经常被称为命名管道。命名管道是一种特殊类型的文件 3.1 创建命名管道 命令行方式创建
mkfifo filename
在代码中创建
int mkfifo(const char *filename,mode_t mode);
真实权限收到umask的影响 匿名管道与命名管道的区别
匿名管道由pipe函数创建并打开。
命名管道由mkfifo函数创建打开用open
FIFO命名管道与pipe匿名管道之间唯一的区别在它们创建与打开的方式不同一但这些工作完
成之后它们具有相同的语义。命名管道的打开规则
如果当前打开操作是为读而打开FIFO时
O_NONBLOCK disable阻塞直到有相应进程为写而打开该FIFO
O_NONBLOCK enable立刻返回成功
如果当前打开操作是为写而打开FIFO时
O_NONBLOCK disable阻塞直到有相应进程为读而打开该FIFO
O_NONBLOCK enable立刻返回失败错误码为ENXIO 实验1-用命名管道实现文件拷贝 实验2-用命名管道实现serverclient通信 3. system V共享内存
共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间这些进程间数据传递不再涉及到 内核换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据 共享内存数据结构
struct shmid_ds {struct ipc_perm shm_perm; /* operation perms */int shm_segsz; /* size of segment (bytes) */__kernel_time_t shm_atime; /* last attach time */__kernel_time_t shm_dtime; /* last detach time */__kernel_time_t shm_ctime; /* last change time */__kernel_ipc_pid_t shm_cpid; /* pid of creator */__kernel_ipc_pid_t shm_lpid; /* pid of last operator */unsigned short shm_nattch; /* no. of current attaches */unsigned short shm_unused; /* compatibility */void *shm_unused2; /* ditto - used by DIPC */void *shm_unused3; /* unused */
};共享内存函数
shmget函数
功能用来创建共享内存
原型int shmget(key_t key, size_t size, int shmflg);
参数key:这个共享内存段名字size:共享内存大小shmflg:由九个权限标志构成它们的用法和创建文件时使用的mode模式标志是一样的
返回值成功返回一个非负整数即该共享内存段的标识码失败返回-1
shmat函数
功能将共享内存段连接到进程地址空间
原型void *shmat(int shmid, const void *shmaddr, int shmflg);
参数shmid: 共享内存标识shmaddr:指定连接的地址shmflg:它的两个可能取值是SHM_RND和SHM_RDONLY
返回值成功返回一个指针指向共享内存第一个节失败返回-1shmaddr为NULL核心自动选择一个地址
shmaddr不为NULL且shmflg无SHM_RND标记则以shmaddr为连接地址。
shmaddr不为NULL且shmflg设置了SHM_RND标记则连接的地址会自动向下调整为SHMLBA的整数倍。公式shmaddr -
(shmaddr % SHMLBA)
shmflgSHM_RDONLY表示连接操作用来只读共享内存
shmdt函数
功能将共享内存段与当前进程脱离
原型int shmdt(const void *shmaddr);
参数shmaddr: 由shmat所返回的指针
返回值成功返回0失败返回-1
注意将共享内存段与当前进程脱离不等于删除共享内存段
shmctl函数
功能用于控制共享内存
原型int shmctl(int shmid, int cmd, struct shmid_ds *buf);
参数shmid:由shmget返回的共享内存标识码cmd:将要采取的动作有三个可取值buf:指向一个保存着共享内存的模式状态和访问权限的数据结构
返回值成功返回0失败返回-1 cmd IPC_STAT得到共享内存的状态把共享内存的shmid_ds结构复制到buf中 IPC_SET改变共享内存的状态把buf所指的shmid_ds结构中的uid、gid、mode复制到共享内存的shmid_ds结构内 IPC_RMID删除这片共享内存 键就是共享内存的keyshmid是共享内存的编号semid是信号量数组的编号nsems对应信号量集中信号量的个数pid就是进程ip,可通过 ps -ef | grep pid 查看详情semnum是信号量的编号ncount是等待该信号的进程数拥有者就是创建它的用户owner权限也就是perms字节为创建的大小bytes连接数为连接到共享内存的进程数nattach状态是共享内存的状态status。 4. system V消息队列 5. system V信号量 6.进程互斥
由于各进程要求共享资源而且有些资源需要互斥使用因此各进程间竞争使用这些资源进程的这种关系为进程的互斥系统中某些资源一次只允许一个进程使用称这样的资源为临界资源或互斥资源。在进程中涉及到互斥资源的程序段叫临界区特性上IPC资源必须删除否则不会自动清除除非重启所以system V IPC资源的生命周期随内核