用卫生纸做的礼物街网站,wordpress如何管理员密码,网站空间的配置,工信部域名备案管理系统管道
匿名管道
匿名管道的⽣命周期#xff0c;是随进程的创建⽽建⽴#xff0c;随进程的结束⽽销毁
匿名管道的创建#xff0c;需要通过下⾯这个系统调⽤#xff1a;
int pipe(int fd[2]) 这⾥表示创建⼀个匿名管道#xff0c;并返回了两个描述符#xff0c;⼀个是…管道
匿名管道
匿名管道的⽣命周期是随进程的创建⽽建⽴随进程的结束⽽销毁
匿名管道的创建需要通过下⾯这个系统调⽤
int pipe(int fd[2]) 这⾥表示创建⼀个匿名管道并返回了两个描述符⼀个是管道的读取端描述符 fd[0] 另⼀个是管道的写⼊端描述符 fd[1] 。注意这个匿名管道是特殊的⽂件只存在于内存不存于⽂件系统中。
所谓的管道就是内核⾥⾯的⼀串缓存。从管道的⼀段写⼊的数据实际上是缓存在内核中的另 ⼀端读取也就是从内核中读取这段数据。另外管道传输的数据是⽆格式的流且⼤⼩受限。
匿名管道的两个文件描述符都在一个进程怎么进行进程间通信
可以使⽤ fork 创建⼦进程 创建的⼦进程会复制⽗进程的⽂件描述符这样就做到了两个进程各有两个「 fd[0] 与 fd[1] 」两个进程就可以通过各⾃的 fd 写⼊和读取同⼀个管道⽂件实现跨进程通信了。
问题两端都能写入和读出易造成混乱
解决建立两个管道单向传输 对于匿名管道它的通信范围是存在⽗⼦关系的进程。因为管道没有实体也就是没有管 道⽂件只能通过 fork 来复制⽗进程 fd ⽂件描述符来达到通信的⽬的。
对于命名管道它可以在不相关的进程间也能相互通信。因为命令管道提前创建了⼀个类型为管 道的设备⽂件在进程⾥只要使⽤这个设备⽂件就可以相互通信。
消息队列
消息队列⽣命周期随内核如果没有释放消息队列或者没有关闭操作系统
消息队列的通信模式就可以解决。⽐如 A 进程要给 B 进程发送消息 A 进程把数据放在 对应的消息队列后就可以正常返回了 B 进程需要的时候再去读取数据就可以了。同理 B 进程要给 A 进程发送消息也是如此 消息队列是保存在内核中的消息链表在发送数据时会分成⼀个⼀个独⽴的数据单元也就是消 息体数据块消息体是⽤户⾃定义的数据类型消息的发送⽅和接收⽅要约定好消息体的数据类型所以每个消息体都是固定⼤⼩的存储块不像管道是⽆格式的字节流数据。如果进程从消息队列中读取了消息体内核就会把这个消息体删除。
不足之处
⼀是通信不及时⼆是附件也有⼤⼩限制存在⽤户态与内核态之间的数据拷⻉开销
因为进程写⼊数据到内核中的消息队列时会发⽣从⽤户态拷⻉数据到内核态的过程同理另⼀进程读取内核中的消息数据时会发⽣从内核态拷⻉数据到⽤户态的过程
共享内存
消息队列的读取和写⼊的过程都会有发⽣⽤户态与内核态之间的消息拷⻉过程。
共享内存的⽅式就很好的解决了这⼀问题。 共享内存的机制就是拿出⼀块虚拟地址空间来映射到相同的物理内存中。
信号量
为了防⽌多进程竞争共享资源⽽造成的数据错乱所以需要保护机制使得共享的资源在任意时刻只能被⼀个进程访问。正好 信号量就实现了这⼀保护机制。
信号量其实是⼀个整型的计数器主要⽤于实现进程间的互斥与同步⽽不是⽤于缓存进程间通信的数据。
信号量表示资源的数量控制信号量的⽅式有两种原⼦操作
⼀个是 P 操作这个操作会把信号量减去 1相减后如果信号量 0则表明资源已被占⽤进程需阻塞等待相减后如果信号量 0则表明还有资源可使⽤进程可正常继续执⾏。另⼀个是 V 操作这个操作会把信号量加上 1相加后如果信号量 0则表明当前有阻塞中的进程于是会将该进程唤醒运⾏相加后如果信号量 0则表明当前没有阻塞中的进程
P 操作是⽤在进⼊共享资源之前 V 操作是⽤在离开共享资源之后这两个操作是必须成对出现的。
信号
信号是进程间通信机制中唯⼀的异步通信机制因为可以在任何时候发送信号给某⼀进程⼀旦有信号产⽣我们就有下⾯这⼏种⽤户进程对信号的处理⽅式。
执⾏默认操作。 Linux 对每种信号都规定了默认操作例如上⾯列表中的 SIGTERM 信号就是终⽌进程的意思。捕捉信号。我们可以为信号定义⼀个信号处理函数。当信号发⽣时我们就执⾏相应的信号处理函数。忽略信号。当我们不希望处理某些信号的时候就可以忽略该信号不做任何处理。有两个信号是应⽤进程⽆法捕捉和忽略的即 SIGKILL 和 SEGSTOP 它们⽤于在任何时候中断或结束某⼀进程。
Socket
跨网络通信
前⾯提到的管道、消息队列、共享内存、信号量和信号都是在同⼀台主机上进⾏进程间通信那要想跨⽹络与不同主机上的进程之间通信就需要 Socket 通信了。
根据创建 socket 类型的不同通信的⽅式也就不同
实现 TCP 字节流通信 socket 类型是 AF_INET 和 SOCK_STREAM实现 UDP 数据报通信 socket 类型是 AF_INET 和 SOCK_DGRAM实现本地进程间通信 「本地字节流 socket 」类型是 AF_LOCAL 和 SOCK_STREAM「本地数据报 socket 」类型是 AF_LOCAL 和 SOCK_DGRAM。另外 AF_UNIX 和 AF_LOCAL 是等价的所以AF_UNIX 也属于本地 socket